Object-c 对象的使用和定义
2015-10-09 22:12
585 查看
1. 如何定义一个对象
在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。@interface放在.h文件中,而@implementation放在.m的文件中。Object-C中的对象和java,.NET中的对象还是有区别的,其实它更加像C中的指针。
首先我们定义一个@interface 的对象,代码如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
然后再看看@implementation具体对象详细
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
这里要说明一下,感觉这段代码的声明感觉有点像.NET或者Java中的接口和接口的实现,的确是这样的。在Object-C中这是类的定义方法,至于接口的定义是使用其他的方式来定义的,后面再说明。
在定义对象的时候,我们定义了对象的get 和 set方法,这点和面向对象语言方式一样。但是get/set方法的定义太麻烦,还有更加简单的方式在下面介绍.
2. 对象的使用
在使用对象之前我们需要先实例化一个对象实例,实例化对象实例有两种方式:
(1) [对象 new] 如 Engine* en=[Engine new];
(2) [[对象 alloc] init] 如 Engine* en=[[Engine alloc] init];
看看下面这段测试代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
3. @property 的使用
@property是一种代码生成机制,能够生成不同类型的getter和setter方法。如果在Object-C中想要用. 操作来获取对象属性值和属性设置值就要使用@property.
@property使用的语法规则如下:
@property(attribute1,attribute2) type value;
如: @property (nonatomic) NSString*
carName;
@property 要和@synthesize一同使用,测试代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
在详细的描述代码中使用@synthesize 测试代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
4 @property中的attribute简单介绍
readonly-只读,只能读取而不能设定值(不能用setXXXX的函式)。
readwrite-可读可写(默认)。
assign-在设值时替换新旧变量(默认)。
retain-在设值时retain新的变量,release旧变量。
copy-在设值时copy一份新变量,release旧变量。
nonatomic-默认為atomic。
在面向对象的语言中,定义一个对象是使用Class关键字,而在Object-C中则是使用@interface,@interface用于定义对象的属性和方法,@implementation则用于对象的详细描述。@interface放在.h文件中,而@implementation放在.m的文件中。Object-C中的对象和java,.NET中的对象还是有区别的,其实它更加像C中的指针。
首先我们定义一个@interface 的对象,代码如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#import <Foundation/Foundation.h> @interface Engine : NSObject { int age; NSString* name; } -(void) setAge:(int)myage; -(int) getAge; -(void) setName:(NSString*)myname; -(NSString*) getName; @end
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
然后再看看@implementation具体对象详细
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#import "Engine.h" @implementation Engine -(void) setAge:(int)myage { age=myage; } -(int) getAge { return age; } -(void) setName:(NSString*)myname { name=myname; } -(NSString*) getName { return name; } @end
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
这里要说明一下,感觉这段代码的声明感觉有点像.NET或者Java中的接口和接口的实现,的确是这样的。在Object-C中这是类的定义方法,至于接口的定义是使用其他的方式来定义的,后面再说明。
在定义对象的时候,我们定义了对象的get 和 set方法,这点和面向对象语言方式一样。但是get/set方法的定义太麻烦,还有更加简单的方式在下面介绍.
2. 对象的使用
在使用对象之前我们需要先实例化一个对象实例,实例化对象实例有两种方式:
(1) [对象 new] 如 Engine* en=[Engine new];
(2) [[对象 alloc] init] 如 Engine* en=[[Engine alloc] init];
看看下面这段测试代码
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
Engine* en=[[Engine alloc] init]; [en setAge:88]; [en setName:@"hechen"]; int age=[en getAge]; NSString* name=[en getName]; NSLog(@"------------直接输出赋值---------------"); NSLog(@"age:%i ; name:%@",age,name); NSLog(@"------------直接输出赋值---------------"); NSLog(@"age:%i ; name:%@",[en getAge],[en getName]);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
3. @property 的使用
@property是一种代码生成机制,能够生成不同类型的getter和setter方法。如果在Object-C中想要用. 操作来获取对象属性值和属性设置值就要使用@property.
@property使用的语法规则如下:
@property(attribute1,attribute2) type value;
如: @property (nonatomic) NSString*
carName;
@property 要和@synthesize一同使用,测试代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#import <Foundation/Foundation.h> #import "Engine.h" @interface MyCar : NSObject { int value; float fValue; NSString* carName; Engine* en; } @property (nonatomic) int value; @property (nonatomic) float fValue; @property (nonatomic) NSString* carName; @property (retain) Engine* en; @end
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
在详细的描述代码中使用@synthesize 测试代码如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030189/81178cc93a2a3bb5048d90d76e7ec935.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
#import "MyCar.h" @implementation MyCar @synthesize value; @synthesize fValue; @synthesize carName; @synthesize en; @end
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/69c5a8ac3fa60e0848d784a6dd461da6.gif)
4 @property中的attribute简单介绍
readonly-只读,只能读取而不能设定值(不能用setXXXX的函式)。
readwrite-可读可写(默认)。
assign-在设值时替换新旧变量(默认)。
retain-在设值时retain新的变量,release旧变量。
copy-在设值时copy一份新变量,release旧变量。
nonatomic-默认為atomic。
相关文章推荐
- Object-C总结
- Python中用json.loads解码字符串出错:ValueError: No JSON object could be decoded
- 【Objective-C学习笔记】变量和基本的数据类型
- [Objective-c]_[NSUserDefaults]_[基本使用]
- 黑马程序员-----------Objective-C基础-----------OC基础
- C#中object missing = Type.Missing是什么意思
- shared libraries: libgtest.so.0: cannot open shared object fi
- Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference
- [Objective-c]_[块语法的使用及应用场景]
- iOS开发之Objective-C与JavaScript的交互
- 理解 Objective-C Runtime
- 【FAQ】Gerrit上打开的单子无法打开,点击提示“MissingobjectException:Missing unknown xxxx”
- objc_getAssociatedObject 出现异常
- iOS开发-基础:Object-C 中self. 与 下划线的区别
- JAVA基础——JSONObject,JSONArray 的一些常见用法
- java:所有东西都是对象,所以根类就是Object
- 《SICP》读书笔记--Chapter 3 Modularity, Objects and State
- object类型转string类型(的三种方法)
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
- OC基础17:归档