為什么很多內(nèi)置類如UITableView的delegate屬性都是assign而不是retain?

為什么很多內(nèi)置類如UITableView的delegate屬性都是assign而不是retain?

所有的引用計數(shù)系統(tǒng),都存在循環(huán)引用的問題。例如下面的引用關(guān)系:對象a創(chuàng)建并引用了對象b,對象b創(chuàng)建并引用了對象c,對象c創(chuàng)建并引用了對象b.這時候b和c的引用計數(shù)分別是2和1。當(dāng)a不再使用b,調(diào)用release釋放對b的所有權(quán),因為c還引用了b,所以b的引用計數(shù)為1,b不會被釋放。b不釋放,c的引用計數(shù)就是1,c也不會被釋放。從此,b和c永遠(yuǎn)留在內(nèi)存中。

這種情況,必須打斷循環(huán)引用,通過其他規(guī)則來維護(hù)引用關(guān)系。比如,我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,賦值不會增加引用計數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用。如果一個UITableViewController對象a通過retain獲取了UITableView對象b的所有權(quán),這個UITableView對象b的delegate又是a,如果這個delegate是retain方式的,那基本上就沒有機(jī)會釋放這兩個對象了。

如果是retain會引起循環(huán)引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 37.cocoa內(nèi)存管理規(guī)則 1)當(dāng)你使用new,alloc或copy方法創(chuàng)建一個對象時,該對象的保留計數(shù)器值為1...
    如風(fēng)家的秘密閱讀 887評論 0 4
  • 1. 使用 #import 相對c的 include 是防止頭文件的重復(fù)導(dǎo)入 2. NSLog 相對于 print...
    迎風(fēng)起飛的豬閱讀 1,769評論 6 9
  • 重點掌握 3 類對象和方法 對象就是一個物體 類的獨特存在就是一個實例,對實例進(jìn)行操作叫做方法。方法可以應(yīng)用于類或...
    Coder大雄閱讀 1,281評論 0 2
  • 之前配置過幾次,步驟不多但是做起來也麻煩。我干脆把所有東西寫到一個shell腳本里了,直接執(zhí)行即可。文件存放的目錄...
    David栗子閱讀 675評論 0 0
  • 01 從前那么遠(yuǎn),遠(yuǎn)的早已想不起開始,又是那么近,近的仿佛一切都發(fā)生在昨天。 常常會聽到很多人的抱怨,當(dāng)初在一起時...
    木子不愛糖閱讀 726評論 2 4