【发布时间】:2012-12-04 08:08:54
【问题描述】:
我正在使用 ARC,我在观察者的 dealloc 中调用 [[NSNotificationCenter defaultCenter] removeObserver:someObserver];。
来自NSNotificationCenter Class Reference
请务必在之前调用此方法(或 removeObserver:name:object:) notificationObserver 或指定的任何对象 addObserver:selector:name:object: 被释放。
NSNotificationCenter 不保留观察者。
Q1:NSNotificationCenter 线程安全吗?
如果观察者正在被释放(并从通知中心移除观察者)并且另一个线程同时发布通知。
我遇到随机崩溃,我怀疑是这种情况。
Q2:这种情况可能吗?
Q3:会不会导致EXC_BAD_ACCESS?
Q4:那么,在观察者的dealloc 中调用[[NSNotificationCenter defaultCenter] removeObserver:someObserver]; 是否安全?
Q5:如果不安全,我应该在哪里拨打removeObserver:?
【问题讨论】:
-
如果您使用 ARC,为什么要删除自己?编译器将释放它。
-
@AnoopVaidya 使用 ARC 会自动从 NSNotificationCenter 中移除观察者?
-
没有。即使使用 ARC,您也需要移除观察者。我一直都是在
dealloc的方法里做的,不知道你的问题出在哪里…… -
这里的问题不是要删除dealloc中的观察者,而是让dealloc被另一个线程而不是主线程调用。如果您的应用程序设计良好,则应在主线程中调用 dealloc(对于与 UI 相关的任何内容),并且删除观察者应该没有问题。见stackoverflow.com/questions/2746197/…
标签: objective-c memory-management automatic-ref-counting nsnotificationcenter