iOS笔记 - block在使用中的若干问题


一、错误地使用 __block

1 - 错误代码

1 __block ViewController* weakSelf = self;
2 dispatch_async(dispatch_get_main_queue(), ^{
3   weakSelf.xx = xx;
4 });

说明:dispatch_async 并不知道 self 会在什么时候被释放,为了防止系统调度执行 block 中的任务时 self 被意外释放掉,dispatch_async 会自己进行一次 retain self 的处理,并且当任务完成后自行 release self但这里使用了 __block 就会使 dispatch_async 不再增加 self 的引用计数,使得系统在调度执行 block 之前,self 很可能已被销毁

正解:把 __block 关键字移除即可