3

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

4

1 回答 1

5

C是(几乎)你想要的:

__typeof(self) __weak weakSelf = self;
self.block = ^{
  __typeof(weakSelf) strongWeakSelf = weakSelf;
  [strongWeakSelf foo]; //use strongWeakSelf, not weakSelf.
};

__strongor__weak 所有权限定符与您从中获得的类型不同__typeof__()

BA相同,C与D相同,因为局部变量是隐式的__strong

但是学究式地,所有这些示例可能都无法满足您的要求!由于strongWeakSelf实际上并未使用,优化器可能能够将其删除。

此外,如果您正在测试其中任何一个,请注意objc_loadWeak当前用于读取的运行时函数weakSelf(当前)正在执行它今天加载的值的保留+自动释放。所以在实践中,这些例子中的每一个都是同样安全的。但是,不能保证将来总是如此。

于 2013-04-29T21:41:12.250 回答