美文网首页
iOS 开发_深入浅出的剖析Block二、Block循环引用

iOS 开发_深入浅出的剖析Block二、Block循环引用

作者: iOS_PM_WEB_尛鹏 | 来源:发表于2018-12-20 10:32 被阅读0次

    【作者前言】:13年入圈,分享些本人工作中遇到的点点滴滴那些事儿,17年刚开始写博客,高手勿喷!以分享交流为主,欢迎各路豪杰点评改进!

    1.应用场景:

    Block经常被应用于设计模式,界面传值,代码块绑定,增强项目灵活性,提升代码B格等

    2.实现目标:

    理解Block的循环引用???---面试必备技能

    3.代码说明:

    1)为何会有循环引用?

    正常情况举例:A --->持有B时 --->会是B的retainCount +1...
    在A不持有B时--即Adealloc后给B释放信号--->B接到release信号,retainCount - 1 ---> 当B的retainCount为0时,B的dealloc被调用--->进入自动释放池,释放B中所有的对象--->A就会进入休眠区域,等待外界的界面响应
    有正常自然就有不正常的情况~~~

    不正常情况
    A ---->B
    B ---->A
    互相持有,互相引用,你中由我,我中有你,无法执行析构函数(dealloc),无法释放

    2)循环引用的代码
    image.png image.png
    3)循环引用-通常处理方式

    ①_ _weak 处理
    分析 : weak修饰的属性会在出了作用域之后立即释放

        self.testStr = @"测试";
        //循环引用产生原因: self--->持有属性 block --->block代码块中又持有了self
        //解决途径,打破循环引用:self ---> block /weak/--->self
        __weak typeof(self)weakSelf = self;
        self.block = ^{
            //出了代码块作用域, weak---释放
            NSLog(@"%@",weakSelf.testStr);
        };
    

    ②_ _block 处理
    分析:_ _block修饰的属性 会在另外开辟新的内存区域,生成新的空间变量

    //_ _block :变量捕捉拷贝
    //self ---> block --->blockSelf(在另一个内存区域,生成新的空间变量)
    //blockSelf = nil; 是为了置为野指针,释放空间
        __block ViewController *blockSelf = self;
        self.block = ^{
            NSLog(@"%@",blockSelf.testStr);
            blockSelf = nil;
        };
    

    ③利用形参处理
    分析:self--->block--->self 想办法打破其中一个环节,考虑到使用临时的形参,将block代码块内的self变成一个形参,解决循环引用

        self.block = ^(ViewController *vc) {
            NSLog(@"%@",vc.testStr);
        };
        self.block(self);
    

    相关文章

      网友评论

          本文标题:iOS 开发_深入浅出的剖析Block二、Block循环引用

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