Objective-C Property

kim_jin發表於2017-12-26

整理一下關於OC中property的知識。

概念

@property相信大家也都很熟悉了。在iOS開發中,@property一般用來宣告物件或者屬性,使用@property宣告的物件就能通過點語法來進行呼叫。在幾年以前,使用@property的話,會和@synthesize配套使用,令編譯器能夠合成訪問器方法。不過後來都預設自動合成訪問器方法。

@property Object *objectObject *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之後,新增了nonnullnullablenull_resetable來對應Swift中的Optional型別。

相關文章