淺談iOS中的迴圈引用問題
阿新 • • 發佈:2019-01-31
關於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