__weak typeof(self) =weakSelf与__strong typeof(self) strongSelf = weakSelf

__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 中的事件执行正确。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容