block和循环引用小结

2016-07-19  本文已影响49人  ValienZh

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];
    });
上一篇下一篇

猜你喜欢

热点阅读