1. 程式人生 > >IOS的迴圈引用及解決方法

IOS的迴圈引用及解決方法

何為迴圈引用:
迴圈引用可以簡單理解為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;