Block循环引用

循环引用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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值