Ошибка неверного доступа в методе 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 пример.

Другие вопросы по тегам