标签:
objective-c在其对象拥有成员变量时,我们为了保持代码的封装,会将成员变量设置为@protected,并为成员变量编写setter和getter方法。
如:
@interface Person : NSObject { @protected int _age; } - (int)get; - (void)setAge:(int)age; @end @implementation Person - (int)get { return _age; } - (void)setAge:(int)age { _age = age; } @end
在Xcode中,为了让我们摆脱这种枯燥的格式化代码,增加了@property属性设置,使用@property属性,编译器会自动帮我们实现这些代码,
如:
@interface Person : NSObject @property int age; @end @implementation Person @end
这段代码经过编译器编译后与上面的代码完全相同。
但是,在实际应用中,内存管理,多线程,成员变量是否只读等等需求很多,所以@property为我们提供了很多参数来实现这些不同的需求,如下:
1.内存管理相关:
*retain:release旧值,retain新值(适用于对象类型的成员变量)
*assign:直接赋值(默认参数,适用于基本数据类型的成员变量)
*copy: release旧值,copy新值
注:关于内存管理,请阅读http://www.cnblogs.com/yoran-yang/p/4293546.html
以retain为例:
@interface Person : NSObject @property (retain) Book *book; @end
等同于:
@interface Person : NSObject { @protected Book *_book; } - (Book *)get; - (void)setBook:(Book *)book; @end @implementation Person - (Book *)get { return _book; } - (void)setBook:(Book *)book { if(book != _book) { [book release]; _book = [book retain]; } } @end
2.读写控制相关
*readwrite:同时生成getter与setter的声明和实现(默认参数)
*readonly:只生成getter方法
3.多线程相关
*nonatomic:禁止多线程,变量保护,提高性能,读写成员变量的操作效率可以提高数倍(强烈建议在非多线程环境的程序加上此参数)
*atomic:线程安全的,性能低(默认参数为线程安全的,即加线程锁)
4.setter和getter方法的名称
*getter =(getter的方法名)
*setter =(setter的方法名)注意:此方法名必须加上后面的“:”。
objective-c在Xcode中@property相关参数的解释
标签:
原文地址:http://www.cnblogs.com/yoran-yang/p/4293612.html