众所周知,block
如果block
隐含地保留了一个对象,该对象也保留了block
. 例子:
self.block = ^{
[self foo];
};
通常规定的解决方法是简单地使用 a__weak
self
来避免保留周期:
__typeof(self) __weak weakSelf = self;
self.block = ^{
[weakSelf foo];
};
但是,如果self
在执行过程中解除分配,这可能会导致问题foo
。更好的策略是在块内捕获对本地的__strong
引用。__weak
self
但是,我不知道__weak
修饰符是否被捕获__typeof
,如果是,我可以用另一个覆盖它__strong
吗?
所以,其中之一是正确的,但哪个?
一种
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(self) strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
乙
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(self) __strong strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
C
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(weakSelf) strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
D
__typeof(self) __weak weakSelf = self;
self.block = ^{
__typeof(weakSelf) __strong strongWeakSelf = weakSelf;
[strongWeakSelf foo];
};
我希望C是正确的,因为它根本没有放在self
里面block
,也不需要额外的__strong
.
编辑
我完全搞砸了我最初的问题,并且我的例子错了。在我的积木中,我所有的答案都曾经是[weakSelf foo]
而不是[strongWeakSelf foo]
.