美文网首页
iOS 解决Block循环引用

iOS 解决Block循环引用

作者: 星之夜下 | 来源:发表于2020-03-08 13:12 被阅读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__);

    }

    相关文章

      网友评论

          本文标题:iOS 解决Block循环引用

          本文链接:https://www.haomeiwen.com/subject/bteddhtx.html