iOS劝退指南面试必读

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

上一篇 下一篇

猜你喜欢

热点阅读