iOS 解决Block循环引用

2020-03-08  本文已影响0人  星之夜下

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__);

}

上一篇下一篇

猜你喜欢

热点阅读