我已经分配了一个字典,准备进入我的程序的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,这让我相信内存是一个问题,我没有正确处理它。为什么它甚至会改变那样的类型?导致它导致函数调用搞乱......
答案 0 :(得分:2)
问题是您分配的NSMutableDictionary
会立即被HBLoadDictionary
的返回值替换。我假设HBLoadDictionary
返回一个自动释放的对象,你不会保留在任何地方。加载字典后不久,它就被解除分配,因此dict
指向释放的内存。此外,您分配的第一个NSMutableDictionary已泄露。
您可以通过替换
来解决此问题dict = [[NSMutableDictionary alloc]init];
dict = HBLoadDictionary(@"/dict.plist");
与
dict = [HBLoadDictionary(@"/dict.plist") retain];
作为旁注,在objective-c方法中初始化全局变量是不好的做法。虽然您可能不会有多个应用程序委托,并且其应用程序:didFinishLaunchingWithOptions:方法不会被多次调用,这可能会导致其他情况下的内存泄漏。你最好只使用一个返回静态变量的类方法。