详解weakify(self)与strongify(self)—

作者: fuadam1982 | 来源:发表于2017-05-11 16:28 被阅读167次
    1. weakify(self)展开后是: __weak typeof(self) __weak_self = self;

    2. strongify(self)展开后是:__strong typeof(self) self = __weak_self;

    3. 在block中使用strongify(self);的目的是确保在block作用域内self不会被其它线程释放掉

    4. 以前我们在block中直接使用__weak_self来解除循环引用。这本身没有问题,之所以还要加strongify(self)就是为了避免block中代码执行过程中由于其它线程释放了self导致block内执行的逻辑出现问题。例如:会出现执行前几句代码时访问self还是存在的,但后面的self调用已经变为nil了

    5. 如果是在block外部定义strongify(self)虽然在block中的self还是指向(跳转到定义)这个strongify(self)。但因为方法调用结束后strongify(self)定义的局部self变量被释放了,所以这种做法就回退到了[4]

    6. 由5可知,如果block中有多个嵌套的block异步调用,那么每一个block中都要再定义一个strongify(self);

    7. 虽然在多层嵌套的block中,定义weakify(self)也是可行的。但是不推荐这么做

    8. swift中使用unowned和weak来解决循环引用问题,基本原理同OC。但unowned本质上是__unsafe_unretained即assign,所以使用起来要小心野指针。还是推荐无脑用weak

    9. 不过要达到[3]中的效果,就要在当前closure的作用域内retain下self,只不过有个小麻烦是没法像OC中写的那么自然——不能使用self了。例子如下:

       obj.doSomething {[weak self] in
         if let strong_self = self {
             strong_self.Member_XXX
         }
       }

    相关文章

      网友评论

        本文标题:详解weakify(self)与strongify(self)—

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