__weak typeof(self) weakSelf与__s
2017-04-29 本文已影响34人
Vergil_wj
__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中的事件执行正确。