Objective-C 11 属性property
2016-02-17 16:40
501 查看
一般成员变量对外都需要set和get方法。例如Student.h文件中
而且还需要在.m文件中实现这俩方法。
成员变量少还好,但是成员变量多的话就需要写许多代码来实现这些方法。
这样会造成大量的垃圾代码,苹果公司在Objective-C 2.0中引入了属性(property),它组合了新的预编译指令和新的属性访问器语法。新的属性功能显著减少了必须编写的冗长代码的数量。
@property
@property会自动声明和实现变量的get和set方法。
Student.h文件
Student.m文件
所有的属性都是基于变量的,所以在合成(synthesize)getter和setter方法的时候,编译器会自动创建与属性名称相同的实例变量,所以可以省略变量age的声明。但是如果变量想要自擂直接通过属性访问,则不能省略,必需在头文件中声明。
@synthesize height = _height; 代表getter和setter会去访问_height这个成员变量,没有这个变量会自动创建_height;
在Xcode4.5以后的版本中,可以不必使用@synthesize了,这时编译器自动创建属性名称前加下划线的实例变量,
两个地方可以添加实例变量的声明:头文件和实现文件。然后有什么区别呢?
假设有一个子类,并且想要从子类直接通过属性访问父类中的变量,这种情况变量必须放在头文件中。如果变量只是属于当前类,则可以把他们放在.m文件中。
参数
属性设置参数的方法:@property(参数,参数)类型 名字;
其中参数可以设置也可以不设置,当然可以是1个或多个了。
读写属性(readwrite/readonly)
默认情况下属性是readwrite,可读可写的,也就是会生成setter和getter方法。
readonly 只读的,只生成getter方法,不生成setter方法。
atomicity(nonatomic)
默认情况是atomic,读取函数为原子操作。
atomic就代表给方法进行加锁,保证线程安全。
nonatomic代表方法不需要考虑线程安全问题。
setter语意(assign/retain/copy)
assign/retain/copy 决定了以何种方式对数据成员赋予新值。assign是默认的。
1 copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。
2 一些特别的Object比如NSSstring使用copy。
3 assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。
4 retain代表:在set方法中,release旧值,retain新值
strong与weak
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 指针置为nil;一般storboard连接的控件都是weak。
strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
#import <Foundation/Foundation.h> @interface Student : NSObject { int age; int _no; float _height; } - (void)setAge:(int)newAge; - (int)age; - (void)setNo:(int)newNo; - (int)no; - (void)setHeight:(float)newHeight; - (float)height;
而且还需要在.m文件中实现这俩方法。
- (void)setAge:(int)newAge { age = newAge; } - (int)age { return age; }
成员变量少还好,但是成员变量多的话就需要写许多代码来实现这些方法。
这样会造成大量的垃圾代码,苹果公司在Objective-C 2.0中引入了属性(property),它组合了新的预编译指令和新的属性访问器语法。新的属性功能显著减少了必须编写的冗长代码的数量。
@property
@property会自动声明和实现变量的get和set方法。
Student.h文件
#import <Foundation/Foundation.h> @interface Student : NSObject { int age; int _no; float _height; } // 当编译器遇到@property时,会自动展开成getter和setter的声明 @property int age; //- (void)setAge:(int)newAge; //- (int)age; @property int no; //- (void)setNo:(int)newNo; //- (int)no; @property float height; //- (void)setHeight:(float)newHeight; //- (float)height; @end通过@property可以省略setter和getter方法的生明。效果和上面的一样。
Student.m文件
#import "Student.h" @implementation Student // @synthesize age, height, no; // @synthesize会自动生成getter和setter的实现 // @synthesize默认会去访问跟age同名的变量 // 如果找不到同名的变量,会自动生成一个<span style="color:#ff0000;">私有</span>的同名变量age // @synthesize age; @synthesize age; //- (void)setAge:(int)newAge { // age = newAge; //} // //- (int)age { // return age; //} @synthesize height = _height; //- (void)setHeight:(float)newHeight { // _height = newHeight; //} // //- (float)height { // return _height; //} @synthesize no = _no; //- (void)setNo:(int)newNo { // _no = newNo; //} // //- (int)no { // return _no; //} @end@synthesize也是一种新的编译器功能,表示“创建了该属性的访问代码”。
所有的属性都是基于变量的,所以在合成(synthesize)getter和setter方法的时候,编译器会自动创建与属性名称相同的实例变量,所以可以省略变量age的声明。但是如果变量想要自擂直接通过属性访问,则不能省略,必需在头文件中声明。
@synthesize height = _height; 代表getter和setter会去访问_height这个成员变量,没有这个变量会自动创建_height;
在Xcode4.5以后的版本中,可以不必使用@synthesize了,这时编译器自动创建属性名称前加下划线的实例变量,
@property int age; @property int no; @property float height; @property int number;不使用@synthesize会访问_age _no _height _number; 如果找不到会自动创建私有变量int _age; int _no; float _height; int _number;
两个地方可以添加实例变量的声明:头文件和实现文件。然后有什么区别呢?
假设有一个子类,并且想要从子类直接通过属性访问父类中的变量,这种情况变量必须放在头文件中。如果变量只是属于当前类,则可以把他们放在.m文件中。
参数
属性设置参数的方法:@property(参数,参数)类型 名字;
其中参数可以设置也可以不设置,当然可以是1个或多个了。
读写属性(readwrite/readonly)
默认情况下属性是readwrite,可读可写的,也就是会生成setter和getter方法。
readonly 只读的,只生成getter方法,不生成setter方法。
atomicity(nonatomic)
默认情况是atomic,读取函数为原子操作。
atomic就代表给方法进行加锁,保证线程安全。
nonatomic代表方法不需要考虑线程安全问题。
setter语意(assign/retain/copy)
assign/retain/copy 决定了以何种方式对数据成员赋予新值。assign是默认的。
1 copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。
2 一些特别的Object比如NSSstring使用copy。
3 assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。
4 retain代表:在set方法中,release旧值,retain新值
strong与weak
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 指针置为nil;一般storboard连接的控件都是weak。
strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
相关文章推荐
- 《转》Objective-C Runtime(4)- 成员变量与属性
- 《转》Objective-C Runtime(3)- 消息 和 Category
- 《转》Objective-C Runtime(2)- Object & Class & Meta Class
- 《转》Objective-C Runtime(1)- Self & Super
- 使用ObjectAnimator设置动画
- Objective-C中Self和Super详解
- objective-C学习 谓词NSPredicate 可过滤
- 关于MarshalByRefObject的解释
- CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象
- iOS开发之Objective-C与JavaScript交互操作
- objective-c Unicode转中文 重写NSLog
- setValue 和 setObject 的区别
- Object
- DOM (文档对象模型(Document Object Model))
- Coursera课程Python for everyone:Quiz: Object Oriented Programming
- 解决a different object with the same identifier value was already associated with the session错
- [ES7] Object.observe + Microtasks
- objective-C学习 NSUserDefaults 相当于缓存
- objective-C学习 自定义对象归档 archiver2
- Objective-C中的alloc和init问题