NSMutableDictionary不会保存数据

时间:2012-12-10 00:25:04

标签: objective-c ios

希望有人可以帮助我解决我一直在努力解决的问题......

使用MapBox开发基于地图的应用程序,我想在每个地图注释中附加一个NSMutableDictionary来存储其他数据。我有它工作,但XCode一直让我警告我的一些数据/对象类型,所以我经历并整理了这些,现在它已经坏了。这个想法是在ViewDidLoad上,程序运行一组plist词典来正确设置每个注释 - 这仍然运行正常,因为我的初始anno标记弹出正确的设置。但是,不是每次都回到plist,我想在每个注释的userinfo属性上附加一个字典,然后我可以用它来切换选择数据和其他函数。这是我的代码:

NSDictionary *ExploreSteps = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ExploreSteps" ofType:@"plist"]];
for (NSString *key in [ExploreSteps allKeys])
    {
        //Loop through keys for each anno
        NSDictionary *thisStep = [ExploreSteps objectForKey:key];
        NSNumber *annoIndex = [thisStep objectForKey:@"Index"];
        NSNumber *isLive = [thisStep valueForKey:@"isLive"];
        NSString *annoTitle = [thisStep objectForKey:@"Title"];
        NSString *annoText = [thisStep objectForKey:@"Text"];
        NSString *imagefile = [thisStep objectForKey:@"Imagefile"];
        double longitude = [[thisStep objectForKey:@"Longitude"] doubleValue];
        double latitude = [[thisStep objectForKey:@"Latitude"] doubleValue];
        NSString *pagefile = [thisStep objectForKey:@"Pagefile"];
        NSString *audiofile = [thisStep objectForKey:@"Audiofile"];
        CLLocationCoordinate2D annoCoord = CLLocationCoordinate2DMake(latitude, longitude);

        RMAnnotation *annotation = [[RMAnnotation alloc] initWithMapView:mapView coordinate:annoCoord andTitle:annoTitle];
        annotation.annotationIcon = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imagefile ofType:@"png"]]; 
        annotation.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:annoIndex, @"index", isLive, @"isLive", annoTitle, @"annoTitle", annoText, @"annoText", imagefile, @"imagefile", pagefile, @"pagefile", audiofile, @"audiofile", nil];
        NSLog(@"Title: %@",[annotation.userInfo objectForKey:@"annoTitle"]);
        [mapView addAnnotation:annotation];
    }

NSLog应该吐出annoTitle字符串,但它每次都给我一个空值,而应用程序其余部分的行为也表明存储在字典中的信息根本就没有“通过”。

有什么想法吗?提前谢谢!

ETA:用于初始化字典的修改代码(而不是它似乎对问题产生任何影响!):

NSMutableDictionary *myUserInfo = [[NSMutableDictionary alloc] initWithObjectsAndKeys:annoIndex, @"index", isLive, @"isLive", annoTitle, @"annoTitle", annoText, @"annoText", imagefile, @"imagefile", pagefile, @"pagefile", audiofile, @"audiofile", nil];
        annotation.userInfo = myUserInfo;
        NSLog(@"Title: %@",[annotation.userInfo objectForKey:@"annoTitle"]);
        NSLog(@"Length: %u",[[annotation.userInfo allKeys] count]);

(标题现在返回“(null)”,而长度返回“1”,如果那都有帮助......)

2 个答案:

答案 0 :(得分:1)

您的一个对象几乎肯定是nil。您提到allKeys] count]会返回1,因此我可以进一步说明您isLive的值为nil。因此你的原始行:

[NSMutableDictionary dictionaryWithObjectsAndKeys:annoIndex, @"index", isLive, @"isLive", annoTitle, @"annoTitle", annoText, @"annoText", imagefile, @"imagefile", pagefile, @"pagefile", audiofile, @"audiofile", nil];

行为完全相同:

[NSMutableDictionary dictionaryWithObjectsAndKeys:annoIndex, @"index", nil, @"isLive", annoTitle, @"annoTitle", annoText, @"annoText", imagefile, @"imagefile", pagefile, @"pagefile", audiofile, @"audiofile", nil];

字典将annoIndex作为最终的键值对。

我建议您可能想要获取thisStep的可变副本并删除您不想要的密钥,然后将其作为userInfo传递。

答案 1 :(得分:0)

这是您为userInfo创建NSMutableDictionary的方式。看一下这个Difference between [[NSMutableDictionary alloc] initWithObjects:...] and [NSMutableDictionary dictionaryWithObjects:...]?

” + dictionaryWithObjects:返回一个自动释放的字典 -initWithObjects:你必须自己释放

如果你想让字典作为实例变量持久化,你应该使用init方法创建它或者保留一个自动释放的版本,无论哪种方式你应该确保在你的dealloc方法中释放它 “