IOS的迴圈引用及解決方法
阿新 • • 發佈:2019-02-01
何為迴圈引用:
迴圈引用可以簡單理解為A引用了B,而B又引用了A,雙方都同時保持對方的一個引用,導致任何時候引用計數都不為0,始終無法釋放。
後果:
記憶體不能及時釋放,導致記憶體洩漏,引發程式崩潰。
幾種迴圈引用情景:
1、delegate的寫法,應按照如下寫法,切記不可存在strong標示符。
宣告delegate時請用assign(MRC)或者weak(ARC)
@property (nonatomic, weak, nullable) id <UICollectionViewDelegate> delegate;
@property (nonatomic , weak, nullable) id <UICollectionViewDataSource> dataSource;
2、單例裡面的變數
錯誤寫法,然後將self傳入,導致釋放不掉。
@property (nonatomic,strong) UIViewController *mViewController;
3、block裡面注意弱引用self即可
ARC環境下:
1 self.arr = @[@111, @222, @333];
2 __weak typeof(self) weakSelf=self;
3 self .block = ^(NSString *name){
4 NSLog(@"arr:%@", weakSelf.arr);
5 };
MRC環境下:
解決方式與上述基本一致,只不過將__weak關鍵字換成__block即可
4、傳值時注意被賦值的變數
UIViewController *vc;//預設為strong型別,同樣可寫為UIViewController __strong *vc
UIViewController __weak *vc;//通過__weak弱引用變數。
5、NSTimer會對傳入的target強引用
解決辦法有兩個:
a.GCD 完成NSTimer的功能
https://github.com/mindsnacks/MSWeakTimer
b.用一箇中間物件處理
YYWeakProxy
c.NStimer停止後是不能再開啟的,所以使用的時候 停止timer後設為nil。再在使用的地方建立一個nstimer就好.
self.myTimer = nil;