※ 引述《fightword (呼啦啦~)》之銘言:
: 想請教一下比較基本的問題
: @property(strong, nonatomic)NSString* value1;
: @property(weak, nonatomic)NSString* value2;
: @property NSString* value3;
: 請問一下這3種宣告的value1, value2, value3
: 在ARC中有沒有比較口語話的解譯方式
: 試著去看了一下文件,真覺得完全看不懂
: 先謝謝了
括弧裡面是 property 屬性設定, 可以用來覆寫預設的屬性
整個括弧省略(第三個)代表完全使用預設值
本例的 property type 是 Objective-C object
所以這代表 strong, atomic, readwrite
C scalar(例如 int, struct 等)的預設是 assign, atomic, readwrite
可用的屬性包括:(來源 http://d.pr/JaAK)
01. atomic //default
02. nonatomic
03. strong=retain //default
04. weak=unsafe_unretained
05. retain
06. assign //default
07. unsafe_unretained
08. copy
09. readonly
10. readwrite //default
(第四個應該不對, 後面討論)
其中 atomic 與 nonatomic 是一組, readonly 與 readwrite 是一組
前面兩個代表該 property 的 setter/getter 是否為 thread-safe
一般而言如果你沒用到 threads(含 GCD 等等)用 nonatomic 會節省一些資源
不過差別沒那麼大, 尤其在 OS X
後兩者就是存取權限設定, 應該看字面就知道意思了
接下來就是困難的部分
如果你還不知道 Objective-C 的記憶體管理模式, 請先自行了解
這隨便找個網友推薦的英文書應該都講得不錯
如果真的不想買, 官方文件在這裡(文長注意)http://d.pr/7C0E
好, 假設你已經看完了, 那麼你現在應該懂得基本的 MRR
在使用 ARC 的狀態下, 你不需要自己進行記憶體管理
但是你需要稍微提示編譯器, 它才能幫你插入合適的記憶體管理機制
從簡單的開始
C 純量不需要記憶體管理, 直接用 = 就好
這種管理方式就是 assign
如果是 pointer, 那麼就可能需要記憶體管理
但也或許不用(或不能)—或許因為對象是 C struct 或 C++ class 或其他原因
那麼這時候你就要明確指示編譯器你不想要它幫你管理這個物件
要使用的就是 unsafe_unretained
這會讓你的 setter 成為單純的 pointer assignment
所以其實本質上和 assign 一樣(不是 weak!)
接著就是 strong 和 weak
如果你看完上面很長的官方文件, 那麼應該能了解他們的主要差異
就是一個會 retain 對象, 一個不會
而 weak 與 assign/unsafe_unretained 屬性之間的差異則是
當前者被 release 時, property 值會自動被 nil-out
用下面的狀況為例
MayoralCandidate