我在使用以下目标 C 代码时遇到问题:
为了读取我的应用程序的配置 plist,我创建了 load 和 save Config 方法,但是在将 plist 正确加载到(新分配的)NSMutableDictionary 后,我无法更改任何序列化项目,因为出现了错误的访问错误,这似乎是由错误的内存访问创建。要点是我创建了一个新的 NSMutableDictionary 并将其作为 loadConfig 方法的结果返回。如果我调试代码,则正确创建了 Dictionary 并且其中有两个项目/密钥对。现在,只要我尝试使用 setValue(或 setObject)更改值,我就会在 CFRetain 中收到错误的访问错误。
我究竟做错了什么?
我的代码:
访问加载的配置字典:
OBJCHelpers* objcHelpers = [OBJCHelpers alloc];
NSMutableDictionary* dictSettings = [objcHelpers loadConfig:@"configSettings"]; //Debugged here shows a correct Dictionary in
//dictSettings with following two key/value pairs:
// Key: @"SourceSetting" Value: (int)0
// Key: @"DetectionSetting" Value: (int)0
[dictSettings setObject:(int)srcsetNew forKey:@"SourceSetting"]; //Here the crash happens (btw (int)srcsetNew returns in the debugger (int)2 so thats also not the problem)
[dictSettings setObject:(int)detectionsetNew forKey:@"DetectionSetting"];
加载配置的函数(它实际上将配置文件作为字典返回,在调试器中检查):
- (NSMutableDictionary*)loadConfig : (NSString*) nstrConfigPlistName {
NSArray* nsarraySystemPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* nsstrDocumentsFolder = [nsarraySystemPaths lastObject];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *nsstrConfigPlistFileName = [nstrConfigPlistName stringByAppendingString:@".plist"];
NSString *nsstrPlistStartConfigFile = [[NSBundle mainBundle] pathForResource:nstrConfigPlistName ofType:@"plist"];
NSString *nstrConfigPlistFile = [nsstrDocumentsFolder stringByAppendingPathComponent:nsstrConfigPlistFileName];
if ((![fileManager fileExistsAtPath:nstrConfigPlistFile]) || cboolForcedConfigOverwrite) {
if (![fileManager fileExistsAtPath:nsstrPlistStartConfigFile]) return [NSMutableDictionary alloc];
else {
NSError* error;
if ([fileManager fileExistsAtPath:nstrConfigPlistFile]) [fileManager removeItemAtPath:nstrConfigPlistFile error:NULL];
if (![fileManager copyItemAtPath:nsstrPlistStartConfigFile toPath:nstrConfigPlistFile error:&error])
NSLog(@"Fehler beim kopieren in den Documents Folder : %@ !", [error localizedDescription]);
}
}
return [[NSMutableDictionary alloc] initWithContentsOfFile:nstrConfigPlistFile];
}
返回 NSMutableDictionary 并保留或将其复制到具有 initWithDictionary:[...] copyItems:true 的新字典都没有帮助。
请帮助,在此先感谢