Sal*_*ule 6 messaging reference-counting objective-c self automatic-ref-counting
我有一种偶尔崩溃的方法.
-(void)foo{
[self doSomething];
[self.delegate didFinish];
[self doSomethingElse];
}
Run Code Online (Sandbox Code Playgroud)
-doSomething工作正常,然后我打电话给委托-didFinish.在-didFinish中,对此对象的引用可能设置为nil,在ARC下释放它.当方法崩溃时,它会在-doSomethingElse上执行此操作.我的假设是自我在一个方法中会很强大,允许函数完成.自我弱还是强?有关于此的文件吗?它的强弱是什么原因?
编辑
在受到以下一些答案的启发后,我做了一些调查.在我的情况下崩溃的实际原因是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];
}
Run Code Online (Sandbox Code Playgroud)
self在一个方法中很强大,允许函数完成.自我弱还是强?
selfARC既不强也不弱.假设调用者持有引用,并且self不安全.
也self可以-dealloc在ARC下使用自己的方法进行编辑,并且它被视为"未定义的行为(或至少是危险的)",以便您的程序执行此操作.
它的强弱是什么原因?
它不具备性能 - 避免(在绝大多数情况下)不必要的引用计数inc/dec.即使他们完成了所有这些额外的引用计数操作,您的程序仍然会在多线程程序中或在存在竞争条件(也是UB)时容易出现此类问题.所以这是他们(正确地)确定他们不需要保护自己的极端边缘案例之一.
有关于此的文件吗?