为什么我的NSmutableDictionary被转换为NSCFString?

时间:2011-03-09 20:53:34

标签: nsdictionary

我已经分配了一个字典,准备进入我的程序的appDelegate。

//appdel.m
    NSMutableDictionary *dict;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {    

    // Overide point for customization after application launch.

    dict = [[NSMutableDictionary alloc]init];


    dict = HBLoadDictionary(@"/dict.plist");

    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

所以我希望这个字典存在于其他文件中,所以我把它作为外部的其他文件进行编辑和阅读。

 //viewcontroller.m
    extern NSMutableDictionary *dict;

以后我决定为一个键设置一个对象。 event只是一个EKevent。

NSString* str = [[NSString alloc] initWithFormat:@"%@", event.eventIdentifier];
NSString *eID  = [[NSString alloc]init];
eID = [data valueForKey:@"id"];
[dict setObject:str forKey:eID];

当我调用该函数时,我会得到这个

- [NSCFString setObject:forKey:]:发送到实例的无法识别的选择器

有一次,我甚至得到了一个UIImage而不是NSCFString,这让我相信内存是一个问题,我没有正确处理它。为什么它甚至会改变那样的类型?导致它导致函数调用搞乱......

1 个答案:

答案 0 :(得分:2)

问题是您分配的NSMutableDictionary会立即被HBLoadDictionary的返回值替换。我假设HBLoadDictionary返回一个自动释放的对象,你不会保留在任何地方。加载字典后不久,它就被解除分配,因此dict指向释放的内存。此外,您分配的第一个NSMutableDictionary已泄露。

您可以通过替换

来解决此问题
dict = [[NSMutableDictionary alloc]init];
dict = HBLoadDictionary(@"/dict.plist");

dict = [HBLoadDictionary(@"/dict.plist") retain];

作为旁注,在objective-c方法中初始化全局变量是不好的做法。虽然您可能不会有多个应用程序委托,并且其应用程序:didFinishLaunchingWithOptions:方法不会被多次调用,这可能会导致其他情况下的内存泄漏。你最好只使用一个返回静态变量的类方法。