【问题标题】:Objective-C ARC - does a method retain 'self'? [duplicate]Objective-C ARC - 方法是否保留“自我”? [复制]
【发布时间】:2015-09-08 23:29:01
【问题描述】:

这样做安全吗?

__weak typeof (self) welf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [welf doStuff];
})

....

-(void)doStuff {
    [_member1 someMethod];
    ....
    [_member2 someMethodWithParam:_someCArray[1];];
}

据我了解 ARC,对 [welf doStuff] 的实际调用应该没问题,因为 welf 要么有效(并且方法调用将继续),要么它将是 nil - 调用任何方法nil 在 Objective-C 中被定义为安全行为,所以看起来没问题。

然而,一旦我们进入doStuff,ARC 是否会导致在方法调用期间保留self?如果是这样,我认为我们应该没问题...如果不是,那么 self 可能会在方法调用的中途得到 dealloc'ed,然后我们就会处于不利的境地。

注意:我搜索了这个,但找不到任何明显的东西。也许只是很难搜索?

谢谢!

【问题讨论】:

  • 这个问题已经有豆回答stackoverflow.com/q/19018456/978568
  • @YuriiKolesnykov 我不明白这些问题是如何回答这个问题的。
  • 这不是另一个问题的重复。另一个问题侧重于保留周期。

标签: objective-c automatic-ref-counting


【解决方案1】:

事实证明,我最终找到了答案,在这里:https://stackoverflow.com/a/18011581/234 和这里:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#self

self 在 ARC 下始终为 unsafe unretained,因此在我的示例中,它是不安全的,并且没有什么可以阻止它在我的 doStuff 方法中被释放。哎哟

【讨论】:

  • 您的示例没问题,因为一旦调用 doStuff 直到 doStuff 返回,welf 基本上就会保留。
【解决方案2】:

您需要在块内创建对 self 的强引用并在其上调用方法。

    __weak typeof (self) weakSelf = self;
    dispatch_async(dispatch_get_main_queue(), ^{
        typeof(self) strongSelf = weakSelf;
        [strongSelf doStuff];
    })

是的,Orion,this question itselfthis particular anwswer 回答了您的问题

【讨论】:

猜你喜欢
  • 2012-07-21
  • 2023-04-05
  • 1970-01-01
  • 2014-01-13
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多