鉴于即使在方法调用正在进行时对象也可能被释放(链接) *,对象注册并接收将在与其期望的线程不同的线程上传递的通知是否安全解除分配?
作为参考,文档指出
在多线程应用程序中,通知总是在发布通知的线程中传递,这可能与观察者注册自己的线程不同。
同样重要的是 NSNotificationCenter 不会保留对已注册以接收通知的对象的强引用。
这是一个可能使情况更加具体的示例:
- (id)init {
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:SomeNotification object:nil];
}
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)handleNotification:(NSNotification *)notification {
// do something
}
具有此实现的对象在线程 X 上接收 SomeNotification。在 -handleNotification: 返回之前,对该对象的最后一个强引用(在我可以看到的代码中)被破坏。
我的想法是否正确:
一种。如果 NSNotificationCenter 在调用 -handleNotification: 之前对该对象进行了强引用,则在 -handleNotification: 返回之前不会释放该对象,并且
湾。如果 NSNotificationCenter 在调用 -handleNotification: 之前没有对该对象进行强引用,则该对象可能在 -handleNotification: 返回之前被释放
它以哪种方式(a 或 b)起作用?我还没有在文档中找到这个主题,但是在多线程环境中安全地使用 NSNotificationCenter 似乎有些重要。
更新:上述链接中的答案已更新,表明“ARC 围绕弱引用的调用保留和释放”。这意味着在方法调用正在进行时不应释放对象。