亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Objective-C代理通常給予屬性賦值而不是保留?

為什么Objective-C代理通常給予屬性賦值而不是保留?

holdtom 2019-07-29 15:02:01
為什么Objective-C代理通常給予屬性賦值而不是保留?我正在瀏覽Scott Stevenson維護的精彩博客,我正在嘗試理解一個基本的Objective-C概念,即為委托者分配'assign'屬性vs'retain'。注意,兩者在垃圾收集環境中是相同的。我主要關注的是非基于GC的環境(例如:iPhone)。直接來自Scott的博客:“assign關鍵字將生成一個setter,它直接將值賦給實例變量,而不是復制或保留它。這最適用于NSInteger和CGFloat等原始類型,或者你不直接擁有的對象,如委托?!蹦悴恢苯訐碛形袑ο笫鞘裁匆馑迹课彝ǔA粑业拇?,因為如果我不希望他們離開深淵,保留將為我照顧。我通常抽象UITableViewController遠離其各自的dataSource和委托。我也保留那個特定的對象。我想確保它永遠不會消失,所以我的UITableView總是有它的代表。有人可以進一步解釋我錯在哪里/為什么,所以我可以理解Objective-C 2.0編程中使用委托上的assign屬性而不是retain的常見范例嗎?謝謝!
查看完整描述

3 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

因為發送委托消息的對象不擁有委托。

很多時候,它是相反的,因為當控制器將自己設置為視圖或窗口的委托時:控制器擁有視圖/窗口,因此如果視圖/窗口擁有其委托,則兩個對象將彼此擁有。當然,這是一個保留周期,類似于具有相同結果的泄漏(應該死的物體保持活著)。

其他時候,對象是對等的:沒有一個擁有另一個,可能是因為它們都由同一個第三個對象擁有。

無論哪種方式,具有委托的對象都不應保留其委托。

(順便說一下,至少有一個例外。我不記得它是什么,我認為沒有充分的理由。)


附錄(2012-05-19補充):在ARC下,你應該使用weak而不是assign。nil當對象死亡時,弱引用會自動設置,從而消除了委托對象最終向死代表發送消息的可能性。

如果由于某種原因您遠離ARC,至少更改assign指向對象的屬性unsafe_unretained,這明確表明這是對對象的未歸屬但非歸零的引用。

assign 仍適用于ARC和MRC下的非對象值。


查看完整回答
反對 回復 2019-07-29
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

請注意,當您擁有一個賦值的委托時,每當要釋放該對象時,始終將該委托值設置為nil非常重要 - 因此,如果某個對象沒有取消分配,則應始終小心地將該委托引用置為無效在其他地方這樣做


查看完整回答
反對 回復 2019-07-29
  • 3 回答
  • 0 關注
  • 444 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號