Re: [問題] strong weak
※ 引述《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 ---------> Fruit
orange
市長候選人實例擁有一個叫 orange 的 property, 指向一個 Fruit 實例
如果 orange 是 weak, 那麼當水果被 dealloc 時, orange 屬性會自動變成 nil
但如果它是 assign(或 unsafe_unretained)
那麼水果實例的狀態就完全不會影響到市長候選人
這代表市長候選人必須自己判斷 orange 屬性指向的對象是否有效
另一方面當然 strong 就代表會 retain 對象
當然就不會有上面這些問題, 只會(講得超輕描淡寫XD)造成 retain cycles 而已
最後一個, copy 代表把 setter 獲得的東西 copy 一份來用
被 retain 的是該拷貝, 而不是你原本傳入的物件本身
這通常用在 NSString 或 NSNumber 之類的狀況
你希望設定之後就設定了, 不要因為原本的物件被改變而造成自己改變
例如視窗的標題之類
另外要注意 copy 屬性通常只應該被用在符合 NSCopying protocol 的類別
大概就這樣, 我有點覺得講了等於沒講, 你還是得啃文件
找一本好書來看吧, 會事倍功半的
--
「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。
如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」
-- 班尼多‧加羅素,前義大利藍隊成員
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.94.57
※ 文章網址: http://www.ptt.cc/bbs/MacDev/M.1406522389.A.5B6.html
推
07/28 12:50, , 1F
07/28 12:50, 1F
Edit: 因為藍寶堅尼被 dealloc 太哀傷了, 換個例子
※ 編輯: uranusjr (140.112.94.57), 07/28/2014 13:00:33
推
07/28 13:24, , 2F
07/28 13:24, 2F
推
07/28 13:52, , 3F
07/28 13:52, 3F
推
07/28 16:31, , 4F
07/28 16:31, 4F
→
07/28 17:51, , 5F
07/28 17:51, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
MacDev 近期熱門文章
PTT數位生活區 即時熱門文章