迴圈引用

Crazy巴旦木發表於2018-08-08

編輯文章 迴圈引用產生的原因是物件的互相引用導致產生了環釋放不了記憶體。
正常物件持有釋放順序是B物件是A物件的屬性,若對A傳送release訊息,致使A引用計數為0,則會dealloc A物件,而在A的dealloc的同時,會向B物件傳送release訊息,B被釋放,記憶體被正確回收。不正確的物件持有,A物件持有B物件,B物件持有A物件,A物件想要釋放需要它的持有者B物件傳送release訊息,但是B物件釋放也需要它的持有者A傳送relesase訊息,都在互相等待持有者傳送release訊息,就是迴圈引用,造成記憶體無法釋放。
如何接觸迴圈引用,例子。 delegate為什麼要用week修飾。
如果delegate用strong修飾,在B中A.delegate = B; 由於A的屬性delegate持有B,等於A持有B,但是B中又持有A,就造成了環,由於都是強引用,所以釋放不了,只有把delegate改成弱引用,才能打破這個環。 block中呼叫self的屬性為什麼要用__weak typeof(self) weakSelf = self。 由於self持有block,而如果block中在持有self的話,就形成了環,打破環的話就需要引用self的時候弱引用,讓它得以釋放。

相關文章