[英]Why are Objective-C delegates usually given the property assign instead of retain?
我正在瀏覽Scott Stevenson維護的精彩博客,我正在嘗試理解一個基本的Objective-C概念,即為委托者分配'assign'屬性vs'retain'。 注意,兩者在垃圾收集環境中是相同的。 我主要關注的是非基於GC的環境(例如:iPhone)。
直接來自Scott的博客:
“assign關鍵字將生成一個setter,它直接將值賦給實例變量,而不是復制或保留它。這最適用於NSInteger和CGFloat等原始類型,或者你不直接擁有的對象,如委托。”
你不直接擁有委托對象是什么意思? 我通常會保留我的代表,因為如果我不希望他們離開深淵,保留將為我照顧。 我通常抽象UITableViewController遠離其各自的dataSource和委托。 我也保留那個特定的對象。 我想確保它永遠不會消失,所以我的UITableView總是有它的代表。
有人可以進一步解釋我錯在哪里/為什么,所以我可以理解Objective-C 2.0編程中使用委托上的assign屬性而不是retain的常見范例嗎?
謝謝!
您避免保留委托的原因是您需要避免保留周期:
A創建BA將自己設置為B的委托...... A由其所有者發布
如果B保留A,則A不會被釋放,因為B擁有A,因此A的dealloc永遠不會被調用,導致A和B泄漏。
你不應該擔心A會消失,因為它擁有B並因此在dealloc中擺脫它。
因為發送委托消息的對象不擁有委托。
很多時候,它是相反的,因為當控制器將自己設置為視圖或窗口的委托時:控制器擁有視圖/窗口,因此如果視圖/窗口擁有其委托,則兩個對象將彼此擁有。 當然,這是一個保留周期,類似於具有相同結果的泄漏(應該死的物體保持活着)。
其他時候,對象是對等的:沒有一個擁有另一個,可能是因為它們都由同一個第三個對象擁有。
無論哪種方式,具有委托的對象都不應保留其委托。
(順便說一下,至少有一個例外。我不記得它是什么,我認為沒有充分的理由。)
附錄 (2012-05-19添加):在ARC下,你應該使用weak
而不是assign
。 當對象死亡時,弱引用被自動設置為nil
,從而消除了委托對象最終向死代表發送消息的可能性。
如果由於某種原因您遠離ARC,至少assign
指向對象的屬性更改為unsafe_unretained
,這明確表明這是對對象的未保留但非歸零的引用。
assign
仍然適用於ARC和MRC下的非對象值。
請注意,當您擁有一個賦值的委托時,每當要釋放該對象時,始終將該委托值設置為nil非常重要 - 因此,如果某個對象沒有取消分配,那么該對象應該始終小心地在dealloc中取消委托引用在其他地方這樣做
其中一個原因是避免保留周期。 只是為了避免A和B兩個對象相互引用而且沒有一個從內存中釋放的場景。
對於像NSInteger和CGFloat這樣的原始類型,或者你沒有直接擁有的對象,例如委托,acutally assign最好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.