NSMutableDictionary问题setObject:forKey - 崩溃

时间:2011-09-14 08:48:22

标签: objective-c cocoa nsmutabledictionary

我正在努力使用以下代码。我并不希望它有什么问题。 代码被评论为崩溃:

- (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];
}

}

我想知道从[NSControl stringValue]返回的NSString *是否返回指向内部字符串reperesentaion或新NSString的指针,如果我稍后编辑NSTextField的文本,它将不会更改。

3 个答案:

答案 0 :(得分:5)

找到了罪魁祸首。以下声明来自NSUserDefaults文档:

  

即使您设置了一个,NSUserDefaults返回的值也是不可变的   可变对象作为值。例如,如果您设置了一个可变字符串   作为“MyStringDefault”的值,您以后检索的字符串   使用stringForKey:将是不可变的。

解决方法是从旧的不可变的创建一个新的预设序列,修改它并将其存储回用户默认值。

答案 1 :(得分:0)

尝试[projectionPresets setValue: presetParam forKey: presetName];

同样NSLog你的presetName和presetParam,看看其中任何一个是否为零值。

答案 2 :(得分:-1)

要在NSMutableDictionary中进行setobject,你必须先做

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

然后只有你可以setobject的NSMutableDictionary。可变字典应该是绝对可变的。