美文网首页
Block循环引用

Block循环引用

作者: 越天高 | 来源:发表于2020-10-28 09:18 被阅读0次

    循环引用01

    Person *p = [[Person alloc] init];
            p.age = 19;
            p.block = ^{
                NSLog(@"%i",p.age);
    
            };
    

    上面的代码即使对象过了作用域也不会被销毁,因为两个强引用问题,互相强引用,导致双方都无妨释放。


    block和person之间的引用图
    block和self之间引用

    循环引用02-ARC01

    用__weak、__unsafe_unretained解决,当这个指向的对象销毁之后,__weak会将这指向nil指针,而__unsafe_unretained还是指向原来的地址,是一块已经回收的地址,会产生野指针错误

    block使用弱指针访问person

     Person *p = [[Person alloc] init];
            __weak Person *weakP = p;
            p.age = 19;
            p.block = ^{
                NSLog(@"%i",weakP.age);
    
            };
            p.block();
    

    __unsafe_unretained(不常用)

    循环引用03-ARC02

    用block解决

    __block Person *p = [[Person alloc] init];
    //        __weak Person *weakP = p;
            p.age = 19;
            p.block = ^{
                NSLog(@"%i",p.age);
                p = nil;
    
            };
            p.block();
            
            NSLog(@"%i", p.age);
    

    一旦执行了 p = nil,他就不是一个循环了,但是必要执行一个block,


    内部原理

    循环引用04-MRC

    MRC不支持__weak,MRC下__block不会对那个对象产生强引用


    MRC解决循环引用

    答疑问

    block的原理是怎样的?本质是什么?
    封装了函数调用以及调用环境的OC对象

    __block的作用是什么?有什么使用注意点?
    一旦本修饰,让他回把变量包装成一个对象,解决block内部无法修改auto变量的问题,
    使用注意点,mrc环境下是不会对oc对象变量产生强引用的
    block的属性修饰词为什么是copy?使用block有哪些使用注意?
    block一旦没有进行copy操作,,他就是在栈上或者是全局区,
    就不会在堆上,我们把他放到堆上是为了我们自己控制他的生命周期,
    使用注意:循环引用问题

    block在修改NSMutableArray,需不需要添加__block
    不需要,我们修改arrat是使用指针,而不是改变指针。

    strong 和 copy有什么区别?
    在arc环境下面,没有区别。就算我们使用strong指向block他也会自动copy。mrc环境下都是靠我们自己管理。

    block中不能用弱指针访问person的age变量,解决编译器报错的问题2包住self的命,因为他有可能是空的,所以把他变成强指针。但是,假如block是属于self的,self其实是不会死的,

    __weak typeof(self) weakSelf = self;
         void (^block)(void) = ^{
            __strong typeof(weakSelf) strongSelf = weakSelf;
             NSLog(@"%i", strongSelf.age);
    
        };
        block();
    

    相关文章

      网友评论

          本文标题:Block循环引用

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