1

我在使用以下目标 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 的新字典都没有帮助。

请帮助,在此先感谢

4

1 回答 1

3

如果srcsetNewint,你应该这样做:

[dictSettings setObject:@(srcsetNew) forKey:@"SourceSetting"];

以便将其int转换为NSNumber实例。

于 2013-10-21T11:15:15.133 回答