当前位置:首页 » 其他

[NSConcreteNotification objectForKey:]: unrecognized selector sent to instan

2016-05-12 14:44 本站整理 浏览(21)

项目情况

在项目中,需要使用到消息通知中心,情况是这样的 1.要在一个方法里添加一个名为@”closeHUD”的消息监听

[code] [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeHUD:) name:@"closeHUD" object:nil];
2.在发送消息到NsnotifactionCenter 时候, 分为带userInfo 和 不带userInfo 两种情况

3.需要在

-(void)closeHUD:(NSNotification*)noti{}
方法中,分辨判断
[code][[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil userInfo:[NSDictionary dictionaryWithObject:@"2" forKey:@"1"]];

[code][[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil];

问题出现

在解析Nsnotifaction*的过程中 出现了

[NSConcreteNotification objectForKey:]: unrecognized selector sent to instan错误具体原因,是因为在解析noti的数据时候,没有使用正确的姿势

[code]NSDictionary *dict = [[NSDictionary alloc] init];
    dict = (NSDictionary*)noti;
    NSLog(@"%@",dict);
以为这样就可以获得noti后的字典 其实不然

正确姿势如下

[code] NSDictionary *sDict = [[NSDictionary alloc] init];
    sDict = noti.userInfo;
    NSString *s = [sDict objectForKey:@"1"];
这里noti.userInfo 其实就已经帮我们解析好了 因为我们在post这个消息的时候, 不就是用的字典么~

完整消息注册与发送及解析如下:

添加消息监听
[code]//添加一个名为@"closeHUD"的监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeHUD:) name:@"closeHUD" object:nil];

向消息中心发送消息

[code]//带userInfo
 [[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil userInfo:[NSDictionary dictionaryWithObject:@"2" forKey:@"1"]];

 //不带userInfo
  [[NSNotificationCenter defaultCenter] postNotificationName:@"closeHUD" object:nil];

方法

[code]-(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后 , 错误调用了监听方法,导致方法内的函数出现的各种问题导致