為什么很多內(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永遠留在內(nèi)存中。
這種情況揩抡,必須打斷循環(huán)引用户侥,通過其他規(guī)則來維護引用關(guān)系。比如峦嗤,我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性蕊唐,賦值不會增加引用計數(shù),就是為了防止delegation兩端產(chǎn)生不必要的循環(huán)引用寻仗。如果一個UITableViewController對象a通過retain獲取了UITableView對象b的所有權(quán)刃泌,這個UITableView對象b的delegate又是a,如果這個delegate是retain方式的署尤,那基本上就沒有機會釋放這兩個對象了耙替。
如果是retain會引起循環(huán)引用。