Re: [問題] strong weak

看板MacDev作者 (←這人是超級笨蛋)時間11年前 (2014/07/28 12:39), 11年前編輯推噓4(401)
留言5則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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
good~
07/28 13:24, 2F

07/28 13:52, , 3F
很棒了 我會再看一下 3Q
07/28 13:52, 3F

07/28 16:31, , 4F
會事倍功半的!!!???
07/28 16:31, 4F

07/28 17:51, , 5F
寫錯XDDD 請自行腦內修正
07/28 17:51, 5F
文章代碼(AID): #1JrTGLMs (MacDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1JrTGLMs (MacDev)