iT邦幫忙

0

# iOS APP 開發 OC 第二十一天,ARC 下的循環引用

tags: OC 30 day

兩個對象

if(1)
{
Person *p1 = [Person new];
Book *b1 = [Book new];
}

這個時候記憶體是這樣分配的。

但是如果這兩個物件互相引用呢?

if(1)
{
Person *p1 = [Person new];
Book *b1 = [Book new];
p1.book = b1;
b1.owner = p1;
}

這個時候,將兩個物件釋放掉


發生什麼事,Person 指著Book。Book 指著Person,誰都死不了。這個時候怎麼辦?

使用弱指針


當兩個對象的指針被釋放掉時:

此時Person 沒有強指針指著他,因此他會被釋放。

此時,Book對象也沒有強指針指著他,因此他也會被釋放掉。

總結

在ARC機制下,當兩個物件相互引用時,如果兩邊都使用strong 那麼就會不知道由誰先釋放。導致retain cycle。
改成weak 就知道從 weak 先釋放。


尚未有邦友留言

立即登入留言