typeof() 和 strongself

398 阅读1分钟

在oc中,为了防止block和self互相持有导致都无法释放,我们往往先使用__weak typeof(self)weakSelf = self;__strong typeof(weakSelf)strongSelf = weakSelf;让block持有一个弱引用的self对象,再对weakself强引用,防止block在使用self的时候self被释放。

看一下测试代码和结果:

- (void)test {
    Person *p = [[Person alloc]init];
    __weak typeof(p) weakP = p;
    p.block = ^{
        typeof(weakP) strongP = weakP; // 1

        typeof(p) strongP1 = weakP; // 2

        __strong typeof(weakP)strongP2 = weakP; // 3
        
        Person *strongP3 = weakP; // 4
    };
    p.block();
}

image.png

断点发现两个现象:

  1. 对比方式1和方式2,可以推断出typeof(x)会把修饰符和指针作为一个整体。typeof(weakP)等价于__weak Person *

  2. 方式2和方式3和方式4是等效的,可见oc新建的指针对象默认就是强引用的,Person *strongP2 = weakP;这种方法完全可以替代__strong typeof(weakP)strongP1 = weakP;.