block(二)解决循环引用的三种方式

1.weakself弱引用self

// 第一种解决方式 weak+ weak - Strong-dance
__weak typeof(self) weakSelf = self;
self.block = ^{
NSLog(@"%@",weakSelf.name);
//续租 延长生命周期 strong
// __strong typeof (self) strongSelf = weakSelf;
};//性能差
2.___block修饰对象 《要在block内置空对象,而且block必须调用》 --->MRC下也是使用此方法

//第二种解决方式 mrc:__block
__block ViewController *weakVC = self;   //栈区拷贝到堆区,内存空间重新拷贝一份。__block自动捕捉到堆里面去,是它特有的属性
//weakvc->self--block--weakVC
self.block = ^{
    NSLog(@"%@",weakVC.name);
    //续租  延长生命周期 strong
    //      __strong typeof (self) strongSelf = weakSelf;
    weakVC = nil;

};//性能差
self.block();

3.传对象self作参数,已提供给代码块使用

//第三种方式 传递self 想:为什么会产生循环引用 self->block->self
self.block = ^(ViewController *vc) {
NSLog(@"%@",vc.name);
};
self.block(self);

你可能感兴趣的:(block(二)解决循环引用的三种方式)