block 循环引用(2)



防止block与当前控制器循环引用解决办法:

    __weak __typeof(self)weakSelf = self;

众所周知:

可是如果在这个block里面执行: removeObserver 方法时就会突然崩掉!!!!!


所有有问题找简书!!很强大的想你所想*****

解决办法:

在block实现中增加:

    __strong __typeof(weakSelf)strongSelf = weakSelf;


strong typeof(weakSelf)strongSelf = weakSelf;就是解决这个问题的关键~先将强引用的对象转为弱引用指针,防止了 Block 和对象之间的循环引用。再在 Block 的第一句代码出将 weakSelf 的弱引用转换成 strongSelf 这样的强引用指针,防止了多线程和 ARC 环境下弱引用随时被释放的问题(因为强引用的引用计数至少为1)。

这里大家一定要有一个认识,weakSelf 位于 Block 的外面,strongSelf 位于 Block 的里面。从内存管理的角度来看,weakSelf 是要比 strongSelf 的声明周期要长的。这样就形成了从弱引用到强引用,再从强引用到弱引用的一种变化,也称作weak-strong dance。

  MyViewController * __weak weakMyController = myController;

    myController.completionHandler = ^(NSInteger result) {

    MyViewController *strongMyController = weakMyController;

    if (strongMyController) {

    // ...

    [strongMyController dismissViewControllerAnimated:YES completion:nil];

    // ...

    }

    else {

    // Probably nothing...

    }

    };

if (strongMyController) 是这段代码的亮点。之所以在 Block 的代码执行之前加上这样一个判断,就是为了防止在把 weakSelf 转换成 strongSelf 之前 weakSelf 就已经为 nil 了,这样才能确保万无一失。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值