簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM