gpt4 book ai didi

iphone - 为什么不从 NSNotificationCenter :addObserverForName:usingBlock get called 中删除观察者

转载 作者:技术小花猫 更新时间:2023-10-29 10:19:12 26 4
gpt4 key购买 nike

我对为什么在以下代码中从未删除观察者感到困惑。在我的 viewDidAppear 中,我有以下内容:

-(void)viewDidAppear:(BOOL)animated{

id gpsObserver = [[NSNotificationCenter defaultCenter]
addObserverForName:FI_NOTES[kNotificationsGPSUpdated]
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note){

NSLog(@"run once, and only once!");

[[NSNotificationCenter defaultCenter] removeObserver:gpsObserver];

}];

}

观察者永远不会被移除,每次发出通知时都会输出语句。谁能提供任何指导?

最佳答案

当 block 被 addObserverForName: 压入堆栈时,该方法尚未返回,因此 gpsObserver 为 nil(在 ARC 下)或垃圾/未定义(不在 ARC 下)。在外部使用 __block 声明变量,这应该可以工作。

__block __weak id gpsObserver;

gpsObserver = [[NSNotificationCenter defaultCenter]
addObserverForName:FI_NOTES[kNotificationsGPSUpdated]
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification *note){

NSLog(@"run once, and only once!");

[[NSNotificationCenter defaultCenter] removeObserver:gpsObserver];

}];

我添加了一个 __weak 以确保没有内存泄漏(根据 Matt 的回答)。代码未经测试。

关于iphone - 为什么不从 NSNotificationCenter :addObserverForName:usingBlock get called 中删除观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8477629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com