__strong typeof(self) strongself = weakself
作用是如果执行了这一句,那么程序将保证剩下的所有 block 内的代码都会得到执行,如果没有这一句,假如 block 回调是在主线程,也不会有任何问题,因为只要主线程执行到 block 就证明在这个 block 执行期间主线程没有时间去将 self 置空,因为这里 self 是一个 ui 类型
但是假如是 block 回调是在子线程,block 执行的时候,主线程可能在block 执行到一半的时候就将 self 置空,这时候 block 就很尴尬了,因为代码只执行了一半, 这时候会引起逻辑错误,比如 我可能将数据同步到了数据库,但是没有同步到 ram.
假设 A 界面 push 到 B 界面,B 界面执行 Block 如下:
self.title = @"B界面";
__weak typeof(self) weakSelf = self;
self.block = ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf.title);
});
};
self.block();
如果 B 界面10秒之后返回A界面会正常打印 weakSelf.title 为B界面
但如果 B 界面10秒之内返回 A 界面则会打印 null,因为10秒之内返回,B界面执行dealloc销毁,内存提前销毁,B 界面对应的 self 不存在,因此也不可能执行关于 self 的事项。
self.title = @"B界面";
__weak typeof(self) weakSelf = self;
self.block = ^{
__strong typeof(self) strongSelf = weakSelf;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@", strongSelf.title);
});
};
self.block();
而如果具有 strongSelf,会使 B 界面所对应的 self 引用计数 +1,即使10秒内返回 A 界面, B 界面也不会立刻释放。并且 strongSelf 属于局部变量,存在与栈中,会随着Block的执行而销毁。
总之 strongSelf 就是为了保证 Block 中的事件执行正确。