项目情况
在项目中,需要使用到消息通知中心,情况是这样的
1.要在一个方法里添加一个名为@”closeHUD”的消息监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeHUD:) name:@"closeHUD" object:nil];
2.在发送消息到NsnotifactionCenter 时候, 分为带userInfo 和 不带userInfo 两种情况
3.需要在 -(void)closeHUD:(NSNotification*)noti{}
方法中,分辨判断
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil userInfo:[NSDictionary dictionaryWithObject:@"2" forKey:@"1"]];
和
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil];
问题出现
在解析Nsnotifaction*的过程中 出现了
[NSConcreteNotification objectForKey:]: unrecognized selector sent to instan错误
具体原因,是因为在解析noti的数据时候,没有使用正确的姿势
NSDictionary *dict = [[NSDictionary alloc] init];
dict = (NSDictionary*)noti;
NSLog(@"%@",dict);
以为这样就可以获得noti后的字典 其实不然
正确姿势如下
NSDictionary *sDict = [[NSDictionary alloc] init];
sDict = noti.userInfo;
NSString *s = [sDict objectForKey:@"1"];
这里noti.userInfo 其实就已经帮我们解析好了 因为我们在post这个消息的时候, 不就是用的字典么~
完整消息注册与发送及解析如下:
添加消息监听
//添加一个名为@"closeHUD"的监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeHUD:) name:@"closeHUD" object:nil];
向消息中心发送消息
//带userInfo
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil userInfo:[NSDictionary dictionaryWithObject:@"2" forKey:@"1"]];
//不带userInfo
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil];
方法
-(void)closeHUD:(NSNotification*)noti{
[_hub hide:YES];
NSDictionary *sDict = [[NSDictionary alloc] init];
sDict = noti.userInfo;
NSString *s = [sDict objectForKey:@"1"];
if (noti && [s isEqualToString:@"2"]) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"closeHUD" object:nil];
[Common showMsgBox:@"" msg:@"蓝牙搜索结束" parentCtrl:self];
}
else{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"closeHUD" object:nil];
[Common showMsgBox:@"" msg:@"蓝牙连接失败" parentCtrl:self];
}
}
总结: 使用消息通知,一般出现奔溃的情况,可能不一定是消息通知本身的问题, 更多的可能是所以post后 , 错误调用了监听方法,导致方法内的函数出现的各种问题导致