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類型