众所周知,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].