1. block
- block内没有使用外部变量或是只使用了全局/静态变量时.存于全局代码区,为全局block;---(ARC和MRC下一致)
-
当使用外部变量时
- MRC下,block代码存于栈区;如果此外部变量A存于栈区,那么A会被copy到block分配的栈区;如果A是存于堆区,那么A在block块内与快外同一个.
- ARC下,block代码存于堆区.如果此外部变量A存于栈区,那么A会被copy到block分配的堆区;如果A是存于堆区,那么A在block块内与快外同一个.
- 如果需要修改外部变量,需要在变量前面声明__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];
});
网友评论