userInfo中带有NSDictionary的postNotificationName的奇怪行为

时间:2013-05-28 21:58:16

标签: ios6 nsdictionary nsnotification

我正在尝试调试一个奇怪的问题,我在使用ARC on ios 6在NSNotification中传递NSDictionary作为我的userInfo时看到了。这是我的相关代码:

发送通知:

NSDictionary *feedData = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&jsonParsingError];

NSDictionary* finalData = [[NSDictionary alloc] initWithObjectsAndKeys:@"index", [NSNumber numberWithInt:i], @"myKey", feedData, nil];

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotification" object: nil userInfo:finalData];

我的经纪人注册:

[[NSNotificationCenter defaultCenter] addObserver:frcvc selector:@selector(mySelector:) name:@"myNotification" object:NULL];

我的处理程序声明:

-(void)mySelector:(NSNotification*)notification;

我的处理程序定义,位于MyCollectionViewController类中:

- (void)mySelector:(NSNotification*) notification
{
    NSDictionary* myDict = (NSDictionary*)notification.userInfo;
    int index = [[myDict objectForKey:@"index"] integerValue];
    NSDictionary* myFeed = (NSDictionary*)[myDict objectForKey:@"myKey"];
}

当我运行代码时,我可以看到构造了finalData,并记下了内存地址。当我到达我的回调并提取userInfo时,它是相同的内存地址,但xcode似乎认为它是MyCollectionViewController类型*。当我尝试访问index或myFeed时,它为null。但是在我的输出窗口中,我可以输入

  

“p myDict”

它正确显示NSDictionary *与构造时的内存地址相同!如果我输入

  

“po myDict”

它显示正确的字典键和值!到底是怎么回事?!我试过重建清洁,但这没有帮助。内存似乎很好,因为我得到了正确的地址,似乎可以在调试窗口中访问它。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您的对象和密钥顺序错误:

NSDictionary* finalData = [[NSDictionary alloc] initWithObjectsAndKeys:@"index", [NSNumber numberWithInt:i], @"myKey", feedData, nil];

应该是:

NSDictionary* finalData = [[NSDictionary alloc] initWithObjectsAndKeys: [NSNumber numberWithInt:i], @"index", feedData, @"myKey", nil];

甚至更好,使用Objective-C Literals:

NSDictionary* finalData = @{@"index": [NSNumber numberWithInt:i], @"myKey": feedData};