Ошибка неверного доступа в методе setValue для NSMutableDictionary, созданного с помощью initWithContentsOfFile iOS Цель C
У меня проблемы со следующим Кодексом Objective C:
Чтобы прочитать список конфигурации для моего приложения, я создал методы загрузки и сохранения Config, но после правильной загрузки списка в (вновь выделенный) NSMutableDictionary я не могу изменить ни один из сериализованных элементов из-за ошибки неверного доступа, которая, кажется, создан неправильный доступ к памяти. Суть в том, что я создал новый NSMutableDictionary и возвращаю его как результат метода loadConfig. Если я отлаживаю код, словарь создается правильно и содержит две пары пункт / ключ. Теперь, как только я пытаюсь изменить значение с помощью 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.
Пожалуйста, помогите, спасибо заранее
1 ответ
Если srcsetNew
является int
, вы должны делать:
[dictSettings setObject:@(srcsetNew) forKey:@"SourceSetting"];
таким образом int
превращается в NSNumber
пример.