1. 程式人生 > >為什麼delegate 用 assign 而不使用 retain

為什麼delegate 用 assign 而不使用 retain

迴圈引用
所有的引用計數系統,都存在迴圈應用的問題。例如下面的引用關係:

物件a建立並引用了物件b.物件b建立並引用了物件c.物件c建立並引用了物件b.這時候b和c的引用計數分別是2和1。當a不再使用b,呼叫release釋放對b的所有權,因為c還引用了b,所以b的引用計數為1,b不會被釋放。b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在記憶體中。
這種情況,必須打斷迴圈引用,通過其他規則來維護引用關係。比如,我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的迴圈引用。如果一個UITableViewController 物件a通過retain獲取了UITableView物件b的所有權,這個UITableView物件b的delegate又是a, 如果這個delegate是retain方式的,那基本上就沒有機會釋放這兩個物件了。自己在設計使用delegate模式時,也要注意這點。
因為迴圈引用而產生的記憶體洩露也是Instrument無法發現的,所以要特別小心。
一些和記憶體管理相關的有用內容: