如果在 objective-c 中作为参数传递,引用是否仍然很弱?

Does a reference remain weak if passed as an argument in objective-c?

当我将 self 作为参数传递给函数时,如果我先弱化它会有什么不同吗?

例如:

__weak __typeof(self) weakSelf = self;
[self.someObject doWorkWithDelegate: weakSelf];

在 doWork 函数的主体中,它将它分配给一个强 属性

@property (strong) Foo* fooDelegate;

(我知道这很糟糕,不要走弯路)

这仍然是一个强引用并导致内存循环,尽管我 "weakified" 首先是引用,对吗?

奖金问题:我如何自己检查这个?

弱的是变量weakSelf。也就是说,ARC 在为其分配值时不会发出保留,在超出范围(或分配不同的值)时也不会发出释放。

由于 fooDelegate 属性 很强,分配给它会释放它可能拥有的任何旧值并保留 newly-assigned 值。

所以,是的,这将是一个强有力的参考。从您发布的内容中不清楚它是否会构成保留周期。该方法的名称暗示委托将在工作完成后被清除(因此被释放)。在那种情况下,这不是问题。如果 self.someObject 保持强引用直到它本身被释放并且 self 保持对 someObject 的强引用直到 self 被释放,这只会是一个问题。

原始问题的一个重要方面可以进一步澄清。 “当我将 self 作为参数传递给函数时,如果我先弱化它会有什么不同吗?”

注意示例代码块中:

__weak __typeof(self) weakSelf = self;
[self.someObject doWorkWithDelegate: weakSelf];

ARC 将对传递的每个对象执行保留,包括接收者(即 self.someObjectweakSelf),然后在每个对象完成时释放,允许安全地处理弱对象用于被调用方法的生命周期。所以答案是否定的,先让它变弱没有什么区别,因为它会在通话期间变强。

如果 weak 变量只是在方法的代码块回调中被引用,那么它在该范围内仍然是 weak。

所以这是在块回调中使用 weakSelf 变量调用另一个方法 foo 的常见模式,然后可以安全地使用 self 因为它不再是在执行 foo 期间很弱。但是如果 self 在执行回调之前消失了,那么 [weakSelf foo] 将永远不会被调用,因为 weakSelf 已经消失。

__weak __typeof(self) weakSelf = self;
[self.someObject doWorkWithCallback:^{
  [weakSelf foo];
}];

- (void)foo
{
  // Safely use self here.
  [self doMoreWork];
}