如果在 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.someObject
和 weakSelf
),然后在每个对象完成时释放,允许安全地处理弱对象用于被调用方法的生命周期。所以答案是否定的,先让它变弱没有什么区别,因为它会在通话期间变强。
如果 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];
}