Проблема с NSMutableDictionary setObject: forKey - вылетает - PullRequest
3 голосов
/ 14 сентября 2011

Я борюсь со следующим кодом.Я не понимаю, что с этим не так.Код комментируется в отношении сбоя:

- (IBAction) SavePreset: (id) sender
{

NSString *presetName = [nameCombo stringValue];  // nameCombo is a NSComboBox*
NSUserDefaults *vmDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *projectionPresets = [vmDefaults objectForKey: kVmGeorefPresetKey];

BOOL doSave = YES;

NSString *dictEntry = [projectionPresets objectForKey: presetName];
if (dictEntry) {
    // this branch is not tested yet, plan to test when the rest is working.   
    int userChoice;
    userChoice = NSRunAlertPanel( @"Save Preset",
                               @"This preset (%s) already exists, modify?",
                               @"OK", @"Cancel", nil, presetName);
    doSave = (userChoice == NSAlertDefaultReturn);
    if (doSave) {
        [nameCombo addItemWithObjectValue: presetName];
    }           

}

if (doSave)
{
    // projParamText is of class NSTextField*
    NSString *presetParam = [projParamText stringValue];

    // Up to this point, everything works as expected
    // But, the following statement crashes silently. 
    [projectionPresets setObject: presetParam forKey: presetName];

    // and the subsequent code is never executed
    [savePresetButton setEnabled: NO];
}

}

Интересно, возвращает ли он NSString *, возвращенный из [NSControl stringValue], указатель на внутреннее представление строки или новую NSString, которая не изменится, если я отредактируютекст NSTextField позже.

Ответы [ 3 ]

5 голосов
/ 15 сентября 2011

Нашли виновника.Следующий документ взят из документации NSUserDefaults:

Значения, возвращаемые из NSUserDefaults, являются неизменяемыми, даже если в качестве значения установлен изменяемый объект.Например, если вы установите изменяемую строку в качестве значения для «MyStringDefault», строка, которую вы позже получите с помощью stringForKey: будет неизменной.

Обходной путь - создать новый предустановленный словарь из старогонеизменный, измените его и сохраните обратно с настройками по умолчанию.

0 голосов
/ 20 октября 2013

Чтобы определить объект в NSMutableDictionary, вы должны сначала сделать

NSMutableDictionary *projectionPresets = [[NSMutableDictionary alloc] init];

Тогда только вы можете использовать setobject для NSMutableDictionary. Изменяемый словарь должен быть абсолютным изменяемым.

0 голосов
/ 14 сентября 2011

try [projectionPresets setValue: presetParam forKey: presetName];

Также NSLog ваш presetName и presetParam и посмотреть, являются ли какие-либо из этих значений ноль.

...