天天看點

IOS開發之屬性詳解

在開發過程中經常要用到定義屬性,@property和@synthesize是經常用到的關鍵字,那麼到底該如何正确定義一個屬性呢,我們需要了解其中用到的關鍵字。

atomic: 原子操作(原子性是指事務的一個完整操作,操作成功就送出,反之就復原. 原子操作就是指具有原子性的操作)在objective-c 屬性設定裡面預設的就是atomic,意思就是setter/getter函數是一個原子操作,如果多線程同時調用setter時,不會出現某一個線程執行完setter所有語句之前,另一個線程就開始執行setter,相當于函數頭尾加了鎖. 這樣的話并發通路性能會比較低.

nonatomic: 非原子操作 一般不需要多線程支援的時候就用它,這樣在并發通路的時候效率會比較高. 在objective-c裡面通常對象類型都應該聲明為非原子性的. iOS中程式啟動的時候系統隻會自動生成一個單一的主線程.程式在執行的時候一般情況下是在同一個線程裡面對一個屬性進行操作. 如果在程式中我們确定某一個屬性會在多線程中被使用,并且需要做資料同步,就必須設定成原子性的,但也可以設定成非原子性的,然後自己在程式中用加鎖之類的來做資料同步.通常說nonatomic 是提高在非多線程應用中的讀寫效率

在頭檔案中聲明屬性的時候使用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一次,是在傳遞指針後 retainCount +1。

copy

屬性必須是objc對象,擁有對象所有權,必須在dealloc中release一次。且屬性必須實作NSCopying協定

一般常用于NSString類型,是建立配置設定一個新的空間,從原址的内容複制内容過來

dealloc 後relase的事情,建議是在每個 object的 m檔案裡 成對的建立和銷毀變量.誰建立,誰負責銷毀,誰retain 誰來release