我有一个偶尔会崩溃的方法。
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
-doSomething 工作正常,然后我调用委托 -didFinish。在 -didFinish 中,对该对象的引用可能设置为 nil,在 ARC 下释放它。当方法崩溃时,它会在 -doSomethingElse 上执行此操作。我的假设是 self 在方法中会很强大,从而允许函数完成。自己是弱还是强?有这方面的文件吗?它强或弱的原因是什么?
编辑
在受到以下一些答案的启发后,我进行了一些调查。在我的案例中,崩溃的实际原因是 NSNotificationCenter 在任何情况下都没有保留观察者。Mike Weller 在下面指出,方法的调用者应该在调用对象时保留对象,以防止我上面描述的情况,但是 NSNotificationCenter 似乎忽略了这个问题,并且始终保持对观察者的弱引用。换句话说:
-(void)setupNotification{
//observer is weakly referenced when added to NSNotificationCenter
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:SomeNotification object:nil];
}
//handle the notification
-(void)handleNotification:(id)notification{
//owner has reference so this is fine
[self doSomething];
//call back to the owner/delegate, owner sets reference to nil
[self.delegate didFinish];
//object has been dealloc'ed, crash
[self doSomethingElse];
}