atomic:
原子操作(原子性是指事務的一個完整操作,操作成功就提交,反之就回滾. 原子操作就是指具有原子性的操作)在objective-c 屬性設置里面 默認的就是atomic ,意思就是 setter /getter函數是一個原子操作,如果多線程同時調用setter時,不會出現某一個線程執行完setter所有語句之前,另一個線程就開始執行setter,相當於 函數頭尾加了鎖 . 這樣的話 並發訪問性能會比較低 .
nonatomic:
非原子操作 一般不需要多線程支持的時候就用它,這樣在 並發訪問的時候效率會比較高 . 在objective-c里面通常對象類型都應該聲明為非原子性的. iOS中程序啟動的時候系統只會自動生成一個單一的主線程.程序在執行的時候一般情況下是在同一個線程里面對一個屬性進行操作. 如果在程序中 我們確定某一個屬性會在多線程中被使用,並且需要做數據同步,就必須設置成原子性的,但也可以設置成非原子性的,然后自己在程序中用加鎖之類的來做數據同步.
在頭文件中聲明屬性的時候使用atomic 和 nonatomic等價於在頭文件里面添加2個函數一個是用於設置這個屬性的,一個是用於讀取這個屬性,例如:- (nsstring *)name; - (void)setName:(NSString *)str;
atomic / nonatomic 需要和@synthesize/@dynamic配和使用才有意義.
@synthesize
如果沒有實現setter和getter方法,編譯器將會自動在生產setter和getter方法。
@dynamic
表示變量對應的屬性訪問器方法 , 是動態實 現的 , 你需要在 NSObject 中繼承而來的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 動態實現的方法或者函數。
屬性修飾其他關鍵字:
getter=getterName
指定 get 方法,並需要實現這個方法 。必須返回與聲明類型相同的變量,沒有參數
setter=setterName
指定 set 方法,並需要實現這個方法 。帶一個與聲明類型相同的參數,沒有返回值(返回空值)
當聲明為 readonly 的時候,不能指定 set 方法
readwrite
如果沒有聲明成 readonly ,那就 默認是 readwrite 。可以用來賦值,也可以被賦值
readonly
不可以被賦值
assign
所有屬性都 默認 assign ,通常用於標量(簡單變量 int , float , CGRect 等)
一種典型情況是用在對對象沒有所有權的時候,通常是 delegate ,避免造成死循環(如果用 retain 的話會死循環)
retain
屬性必須是 objc 對象,擁有對象所有權,必須在 dealloc 中 release 一次。
copy
屬性必須是 objc 對象,擁有對象所有權,必須在 dealloc 中 release 一次。且屬性必須實現 NSCopying 協議
一般常用於 NSString 類型