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