【问题标题】:Does a reference remain weak if passed as an argument in objective-c?如果在objective-c中作为参数传递,引用是否仍然很弱?
【发布时间】:2018-08-28 06:09:12
【问题描述】:

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

例如:

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

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

@property (strong) Foo* fooDelegate;

(我知道这很糟糕,不要走神)。

尽管我首先“弱化”了引用,但这仍然是一个强引用并导致内存循环,对吗?

额外问题:我如何自己检查这个?

【问题讨论】:

    标签: objective-c memory memory-management weak-references


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 ARC 逻辑的一部分正是我所缺少的。是否有一种方便的方法可以在调试时识别参考是否弱/强?或者不是真的,因为 __weak 所做的只是增加 ARC 引用计数
    • 忽略评论这个答案给出了详尽的解释stackoverflow.com/questions/8863269/…
    【解决方案2】:

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

    请注意,在示例代码块中:

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

    ARC 将对每个传递的对象执行保留,包括接收者(即self.someObjectweakSelf),然后在完成时释放每个对象,允许弱对象在整个生命周期内安全使用称为方法。所以答案是否定的,首先使它变弱并没有什么不同,因为它会在通话期间保持强。

    如果在方法的代码块回调中简单地引用了弱变量,那么它在该范围内仍然是弱变量。

    所以这是一种常见的模式,在块回调中使用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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多