block 循环引用(2)

来源:互联网 发布:淘宝宝贝手机拍摄技巧 编辑:程序博客网 时间:2024/06/06 11:02



防止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 了,这样才能确保万无一失。


0 0
原创粉丝点击