在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();
}
断点发现两个现象:
-
对比方式1和方式2,可以推断出typeof(x)会把修饰符和指针作为一个整体。
typeof(weakP)等价于__weak Person *。 -
方式2和方式3和方式4是等效的,可见oc新建的指针对象默认就是强引用的,
Person *strongP2 = weakP;这种方法完全可以替代__strong typeof(weakP)strongP1 = weakP;.