NSNotificationCenter无法工作如何调试?参照dreammlax示例仍无效
NSNotification 无法运行的排查方案
嘿,我来帮你梳理下NSNotification的问题,先给你明确几个关键点:
是否需要添加特定框架?
不需要额外添加框架!NSNotification和NSNotificationCenter都是Foundation框架的核心类,iOS/macOS项目的默认模板已经自动引入了Foundation,所以你不用手动添加任何框架。
调试与排查步骤
我把常见的问题和调试方法列出来,你可以一步步检查:
1. 确认接收方正确注册了通知
你只贴了发送方的代码,但问题大概率出在接收通知的ViewController上。接收方必须先注册观察者,才能收到通知。比如如果是TabBar里的第二个VC,你需要在它的viewDidLoad(或者更早的初始化方法)里加这段代码:
- (void)viewDidLoad { [super viewDidLoad]; // 注册通知观察者 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleTestNotification:) name:@"TestNotification" object:nil]; } // 必须实现对应的处理方法 - (void)handleTestNotification:(NSNotification *)notification { // 这里写收到通知后的逻辑,比如NSLog测试 NSLog(@"收到TestNotification啦!"); }
注意:
- 通知名称
@"TestNotification"必须和发送方完全一致(大小写、拼写都不能错); selector对应的方法必须存在,而且参数是NSNotification *,不能少参数或者参数类型错误。
2. 检查接收方的生命周期
如果发送通知时,接收方的ViewController还没被初始化(比如TabBar的第二个VC还没被用户点击过,系统还没加载它的view),那它根本没注册观察者,自然收不到通知。
解决办法:
- 如果需要提前接收通知,可以把注册代码放到接收方的
init方法里; - 或者先切换到接收方的Tab(比如你代码里没写完的
self.tabBarController.selectedIndex = 1;),再发送通知,确保接收方已经完成初始化和注册。
3. 调试技巧
- 断点调试:在发送通知的
btnSend:方法里加断点,确认按钮点击后确实走到了发送通知的代码;在接收方的handleTestNotification:方法里加断点,看是否能触发。 - 日志输出:在发送和接收的地方分别加
NSLog,比如发送时NSLog(@"已发送TestNotification");,接收时NSLog(@"已接收TestNotification");,通过控制台日志判断通知是否真的发出去、有没有被接收。 - 检查观察者移除:虽然iOS 9及以后系统会自动移除观察者,但最好在接收方的
dealloc方法里手动移除,避免潜在的野指针问题:
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
4. 检查通知发送的时机
看你代码里self.tabBarController.selectedIndex...没写完,如果你是想先切换Tab再发通知,一定要注意顺序:先切换Tab,让接收方加载完成,再发送通知。如果反过来,先发通知再切换,接收方还没注册,肯定收不到。
比如正确的顺序可以是:
- (IBAction)btnSend:(id)sender { // 先切换到接收方的Tab self.tabBarController.selectedIndex = 1; // 延迟一点确保VC加载完成(或者用更优雅的方式监听VC加载) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; }); }
内容的提问来源于stack exchange,提问作者Hanz Cheah
相关产品推荐
相关产品推荐

