objective-c在其對象擁有成員變量時,咱們爲了保持代碼的封裝,會將成員變量設置爲@protected,併爲成員變量編寫setter和getter方法。html
如:objective-c
@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爲咱們提供了不少參數來實現這些不一樣的需求,以下:atom
1.內存管理相關:spa
*retain:release舊值,retain新值(適用於對象類型的成員變量)線程
*assign:直接賦值(默認參數,適用於基本數據類型的成員變量)code
*copy: release舊值,copy新值htm
注:關於內存管理,請閱讀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的方法名)注意:此方法名必須加上後面的「:」。