block的迴圈引用的問題
阿新 • • 發佈:2018-12-30
在我們的編寫程式碼的時候,常常會出現一些迴圈引用的問題,今天就說說block的迴圈引用,引起的物件無法被釋放的問題
先說一下我們驗證問題的方法:
-1.Navigationcontroller巢狀vc1;
-2.由vc來push vc2;
當vc2 pop控制器的時候會釋放vc2物件
下面是vc2中主要程式碼:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, copy) void(^block)();
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 定義一個block
void (^task)() = ^{
NSLog(@"%@",self);
};
// 賦值
self.block = task;
// 執行block
self.block();
}
// 檢視物件是否銷燬
- (void)dealloc{
NSLog(@"ViewController再見");
}
這個時候pop,vc的dealloc方法不會被呼叫,因為在block中,獲取了self自身,而block是self建立的一個屬性,造成了迴圈引用的技術問題
這時,我們的解決方法就是:
建立一個弱指標,指向self,然後在block中呼叫這個若指標
這樣做的目的是,在block中不要有強指標指向self,用一個弱指標來代替self,可以獲取到self的同時,也不影響self的生死
有3中方法建立需要的弱指標:
// 方式01
__weak typeof(self) weakSelf = self;
// 方式02
__weak ViewController *weakSelf = self;
// 方式03 (這種方式已經不再使用了 而且快速訪問和返回 會導致野指標訪問)
__unsafe_unretained typeof(self ) weakSelf = self;
同理,在block中引用self的成員變數也會造成迴圈引用問題,解決方法同上.