整理一下關於OC中property的知識。
概念
@property相信大家也都很熟悉了。在iOS開發中,@property
一般用來宣告物件或者屬性,使用@property
宣告的物件就能通過點語法來進行呼叫。在幾年以前,使用@property
的話,會和@synthesize
配套使用,令編譯器能夠合成訪問器方法。不過後來都預設自動合成訪問器方法。
@property Object *object
和Object *object1
有什麼區別? object1是一個例項變數,存在於Object例項記憶體中。object則是該物件的屬性,能夠通過點語法來進行訪問。大多數屬性都是基於例項變數(ivar)進行訪問。簡單點說就是object包含了getter和setter方法以及_object這個例項變數,而object1就僅僅是個例項變數,並不含有訪問器方法
屬性
property的屬性可以分為四類:
* 執行緒安全:atomic/nonatomic
* 訪問許可權:readonly/readwrite
* 記憶體管理(ARC):assign/weak/strong/copy
* 記憶體管理(MRC):assign/retain/copy/unsafe_unretained
* 指定訪問器方法:getter=/setter=
複製程式碼
執行緒安全
-
atomic:
atomic
(原子性)是property的預設值之一。原子性保證了該屬性的執行緒安全。如果線上程B呼叫setter的時候,有個執行緒A要呼叫getter的話,那麼執行緒A會獲取到一個可變的值。atomic
並不常用,因為會影響效能,較低效率。如果使用atomic
的話且想要實現自定義的訪問器方法,必須實現getter和setter方法,缺一不可。 -
nonatomic:
nonatomic
(非原子性)跟atomic
相反。如果執行緒A在獲取一個非原子屬性的字串的時,執行緒B要將字元修改成”Apple“,而執行緒C要修改成”Pen“的話,A獲取出來的值是不確定的,有可能會使程式crash。非原子性並不是執行緒安全,但是勝在夠快。
訪問許可權
-
readwrite: property預設值之一。告訴編譯器生成getter和setter
-
readonly: 告訴編譯器只生成getter即可。通常的用法是,如果想將此屬性暴露給其他類的話,在.h檔案中,將其宣告為
readonly
,在.m檔案,將其宣告為readwrite
.這樣的話,外部的其他檔案就只能獲取,不能修改。
記憶體管理
-
strong: property預設值之一。將屬性宣告為
strong
的話,每當使用該屬性時,會增加引用計數(ARC會替我們完成這項工作,在MRC時代就需要自己計數)。也就是說例項變數會一直在記憶體中持有此屬性,直到引用計數為0.使用strong
的話有可能會引起引用迴圈,但是我們可以使用weak來解決此問題 -
weak: 給定一個指向物件且不會增加引用計數的指標。在其他類或者物件強引用此屬性時,其會保持有一個有效的指標。如果沒有其他物件要引用它的話,馬上就會變為nil。這就避免了引用迴圈。
-
assign: 常用於修飾
int
,long
等原始型別。與weak類似 -
copy: 與
strong
類似,不過它會複製物件的值,且強引用這個藍本。被copy的物件必須遵循NSCopying的協議 -
retain:
strong
的舊版本。 -
unsafe_unretained: 與
weak
類似,但是在沒有其他物件進行引用時,並不會將值設定為nil
修改訪問器方法名稱
- getter=: 自定義訪問器的getter名稱。
- setter=: 自定義訪問器的setter名稱。
Swift
Xcode 6.3之後,新增了nonnull
,nullable
和null_resetable
來對應Swift中的Optional型別。