我有一个偶尔会崩溃的方法。
-doSomething正常工作,然后我调用一个委托-didFinish。在-didFinish中,对这个对象的引用可能被设置为nil,在ARC下释放它。当该方法崩溃时,它会在-doSomethingElse上崩溃。我的假设是self在方法内部是强引用的,使函数能够完成。self是弱引用还是强引用?有没有相关文档?为什么要强制或弱化它? 编辑 受下面一些答案的启发,我进行了一些调查。在我的情况下,崩溃的实际原因是NSNotificationCenter在任何情况下都不会保留观察者。Mike Weller在下面指出,调用方法的调用者应该在调用对象时保留该对象,以防止我上面描述的情况,但似乎NSNotificationCenter忽略了这个问题,并始终保持对观察者的弱引用。换句话说:
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
-doSomething正常工作,然后我调用一个委托-didFinish。在-didFinish中,对这个对象的引用可能被设置为nil,在ARC下释放它。当该方法崩溃时,它会在-doSomethingElse上崩溃。我的假设是self在方法内部是强引用的,使函数能够完成。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];
}
NSLog
来查看self.delegate
的情况? - Desdenova