1. 程式人生 > >淺談iOS中的迴圈引用問題

淺談iOS中的迴圈引用問題

關於iOS中迴圈引用的場景:

1、代理 delegate

     這個一般是不會出錯的,ARC建立代理的時候我們用的是weak,MRC下我們用的assign。基本就避免了這個問題。

2、block

     把block建立某個類的成員屬性時,self會對block產生一個強引用,block建立用的是copy,是因為block會對block內部的變數的值進行copy。這時候block會對block中的變數產生一個強引用。 如果block中有 self.xxxx 或者有屬於self的成員但是沒有self. 這樣的話 就造成了block的迴圈引用問題。

     解決辦法: 通過 __weak  __block 去宣告一個弱引用的self 。

_weak typeof(self) weakSelf = self;

self.blkA = ^{ __strong typeof(weakSelf) strongSelf = weakSelf;//加一下強引用,避免weakSelf被釋放掉 NSLog(@"%@", strongSelf->_xxView); //不會導致迴圈引用. };
    (程式碼為摘抄的)

3、NSTimer
   同樣是當NStimer作為某個類的成員屬性是會發生迴圈引用。設定為成員屬性是有一個self對timer的強引用, 在例項timer的時候一般指定的target為:self。這樣就造成了迴圈引用,
   解決辦法:
     //停止定時器
    [self.myTimer invalidate];
    //銷燬timer
    self.myTimer = nil;

注: NStimer停止後是不能再開啟的,所以使用的時候 停止timer後設為nil。再在使用的地方建立一個nstimer就好。

鄙人愚見,如有不同的意見或者有問題的地方請評論,或者聯絡本人QQ:285160304