【问题标题】:What is a correct way to fix object destruction inside a method在方法中修复对象破坏的正确方法是什么
【发布时间】:2018-04-12 12:57:03
【问题描述】:

考虑以下说明方法执行期间对象破坏问题的 sn-p。

-(void)handleNotification:(id)notification{
    //owner has reference so this is fine
    self.foo += 1;
    //call back to the owner/delegate, owner may set reference to nil
    [self.delegate didFinish];

    //if object has been dealloc'ed, it crashes
    self.bar += 1; // CRASH
}

实际上,我什至无法重现崩溃,因为它很少发生,但我知道它存在于 Crashlytics 报告中。

我正在尝试通过声明对self 的强引用来修复它:

-(void)handleNotification:(id)notification{

    self.foo += 1;

    MyObj *strongSelf = self;
    [self.delegate didFinish];

    strongSelf.bar += 1;
}

但是我不确定它是否正确(正如我所说,我无法重现它并检查崩溃是否已经消失)。 如果此修复正确?此更改是否保证 self 在方法结束之前不会被破坏?

【问题讨论】:

  • didFinish 应该做什么?如果允许处理selfdidFinish应该是方法的最后一条语句。
  • self 在它主动执行之前不会被释放,所以实际的第一个场景实际上根本不可能发生,除非你在 -didFinish 中无法控制地弄乱不同的线程——什么是你的崩溃日志到底是什么?您的工作流程看起来如何?什么时候退订通知中心?
  • @holex 只有当self__strong 引用时,您的声明(“在它主动执行之前不会被释放”)才是正确的。但是,Objective-C 对此不做任何保证。
  • @Nick,一个对象在当前执行时不会被释放,即使它没有没有引用;相反的行为会导致大混乱。
  • @holex 我曾经这么认为,直到我遇到了这次崩溃。不幸的是,没有任何仁慈的全能魔术师来检查某事是否“正在执行”。详情请见stackoverflow.com/questions/17996516/… - 你不会后悔的。

标签: objective-c automatic-ref-counting


【解决方案1】:

我认为进行此类引用不是一个好主意/做法,它会影响您的应用程序的性能。

More info here

此外,我猜你的方法的调用者是NSNotificationCenter,它并没有保留观察者。

【讨论】:

    猜你喜欢
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多