iOS 解决Block循环引用
block的循环引用问题(self ->block ->self)
#import "BlockViewController.h"
typedef void(^MyBlock)(BlockViewController *);
@interface BlockViewController ()
@property(nonatomic,copy) MyBlock mblock;
@end
解决方案可以有一下参考:
(1)__block
在ARC 和 MRC都可以使用,可以修饰对象,也可以修饰基本数据类型,可以在block中重新赋值。
//#pragma mark ---- 方法三,但是需要注意
-(void)block01{
__block BlockViewController *blockVC = self;
self.mblock = ^(BlockViewController *vc){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mblock---%@",blockVC.name);
blockVC =nil;
});
};
//warning:使用该方法需要注意必须执行block,要不然对象不能销毁
self.mblock(self);
}
- (void)dealloc
{
NSLog(@"---- %s",__func__);
}
(2)__weak
弱引用,只能在ARC下使用,只能修饰对象类型,在block中 只能使用不能修改。
//#pragma mark ---- 方法一
-(void)block01{
__weaktypeof(self) weakself =self;
self.mblock = ^(BlockViewController *vc){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mblock---%@",weakself.name);
});
};
self.mblock(self);
}
- (void)dealloc
{
NSLog(@"---- %s",__func__);
}
(1)__strong
强引用,防止block中的对象 由于弱引用 被释放,实际上就是引用计数➕1,导致的延迟操作出现的bug。
//#pragma mark ---- 方法二
-(void)block01{
__weaktypeof(self) weakself =self;
self.mblock = ^(BlockViewController *vc){
__strongtypeof(self) strongself = weakself;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mblock---%@",strongself.name);
});
};
self.mblock(self);
}
- (void)dealloc
{
NSLog(@"---- %s",__func__);
}
(4)传参数形式
//#pragma mark ---- 方法四
-(void)block01{
self.mblock = ^(BlockViewController *vc){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mblock---%@",vc.name);
});
};
//warning:使用该方法需要注意必须执行block,要不然对象不能销毁
self.mblock(self);
}
- (void)dealloc
{
NSLog(@"---- %s",__func__);
}