美文网首页
block和循环引用小结

block和循环引用小结

作者: ValienZh | 来源:发表于2016-07-19 10:13 被阅读49次

    1. block

    1. block内没有使用外部变量或是只使用了全局/静态变量时.存于全局代码区,为全局block;---(ARC和MRC下一致)
    2. 当使用外部变量时
      • MRC下,block代码存于栈区;如果此外部变量A存于区,那么A会被copy到block分配的区;如果A是存于区,那么A在block块内与快外同一个.
      • ARC下,block代码存于堆区.如果此外部变量A存于区,那么A会被copy到block分配的区;如果A是存于区,那么A在block块内与快外同一个.
    3. 如果需要修改外部变量,需要在变量前面声明__Block;
      当使用下划线Block修饰外部变量时:
      • MRC下,无论变量A存于还是区,A在block块内与快外相同;
      • ARC下,如果此外部变量A存于区,那么A会被转移而不是复制区;如果A是存于区,那么A在block块内与快外同一个.

    2. block使用问题: 循环引用.

    只有当block直接或间接的被self持有时,才需要在block内部使用weak self。如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。

       __weak __typeof__(self) weakSelf = self;
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            __strong __typeof(self) strongSelf = weakSelf;
            [strongSelf doSomething];
            [strongSelf doOtherThing];
        });
    

    相关文章

      网友评论

          本文标题:block和循环引用小结

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