0

我正在尝试调试在 ios 6 上使用 ARC 在 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 时,它为空。但是在我的输出窗口中,我可以输入

“p 我的字典”

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

“我的字典”

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

4

1 回答 1

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 文字:

NSDictionary* finalData = @{@"index": [NSNumber numberWithInt:i], @"myKey": feedData};
于 2013-05-29T15:17:29.827 回答