1. 程式人生 > >Objective-C的屬性(property)解析:

Objective-C的屬性(property)解析:

Property

“屬性”(property)是Objective-C的一項特性,用於封裝物件中的資料。使用了屬性的話,編譯器就會自動編寫訪問這些屬性所需的方法(setter和getter),這個過程稱為“自動合成”(autosynthesis)。
@property等同於在.h檔案中宣告例項變數的get/set方法,@synthesize等同於在.m檔案中實現例項變數的get/set方法

Attribute

屬性可以擁有的attribute分為四類:

1. 原子性

  • atomic:預設由編譯器所合成的方法會通過鎖定機制確保其原子性。
  • nonatomic:使用nonatomic語義的話,兩個執行緒讀寫同一屬性,那麼當其中一個執行緒正在改寫某屬性值時,另外一個執行緒也許會突然闖入,把尚未修改好的屬性值讀取出來。發生這種情況時,執行緒讀到的屬性值可能不對。

但是在實際開發iOS程式中,所有屬性都宣告為nonatomic,因為在iOS使用同步鎖的開銷較大,會產生效能問題。一般情況下並不要求屬性必須是“原子的”,因為這並不能保證“執行緒安全”(thread safety),若要實現“執行緒安全”的操作,還需要採用更為深層的鎖定機制才行。因此,開發iOS程式一般都會使用nonatomic屬性

2. 讀寫/許可權

  • readwrite:讀寫,具備readwrite的屬性同時擁有setter和getter方法,若該屬性由@synthesize實現,則編譯器會自動生成這兩個方法。
  • readonly:只讀,僅擁有getter方法。可以用這個attribute把某個屬性對外公佈為只讀屬性,然後在”class-continuation分類”中將其重新定義為讀寫屬性。

3. 記憶體管理語義

  • assign:會生成直接賦值給例項物件的setter方法,通常用來修飾諸如NSInteger、CGFloat等原始型別(primitive type),或者是在類中不想真正持有的物件,類似delegate等。
  • strong: 表明該屬性定義了一種“擁有關係”。為strong屬性設定新值時,setter會先保留新值,並釋放舊值,然後在將新值設定上去。
  • weak:表明屬性定義了一種“非擁有關係”,為weak屬性設定新值時,setter既不保留新值,也不釋放舊值。然而在屬性所指的物件遭到摧毀時,屬性值也會清空。
  • copy:setter並不保留新值,而是將其“拷貝”。當屬性為NSString* 時,通常用這個attribute來保護其封裝性,因為傳遞給setter 的新值有可能指向一個NSMutableString類的例項,此時若是不拷貝字串,那麼在設定完屬性之後,字串的值就可能會在物件不知情的情況下遭人更改。通常的,只要實現屬性所用的物件是可變的(mutable),就應該在設定新屬性值時拷貝一份。
  • retain:setter方法會增加物件的保留數(retain count),用在屬性是指向某個物件的指標時。

4. 方法名

  • getter = < name>:指定getter的方法名。比如說,在UISwitch類中,表示開關是否開啟的屬性就是這樣定義的:
@property (nonatomic, getter=isOn) BOOL on;
  • setter = < name>:指定setter的方法名,這種用法不太常見。