2011-09-14 38 views
3

私は次のコードで苦労しています。私はそれが間違っていることを望ましくない。 コードがクラッシュに関してコメントしている:私は、彼は* [NSControlのstringValue]から返さNSStringのだろうかNSMutableDictionaryの問題setObject:forKey - クラッシュ

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

} 

は、内部の文字列reperesentaionまたは私はテキストを編集する場合は変更されません新しいNSStringのへのポインタを返します後でNSTextFieldの

+1

サイレントにクラッシュしますか?例外もエラーもありません。ブレークポイントでテストしましたか? – Joze

+0

stringValueの呼び出し後にpresetParamの型のデバッガを確認できますか?また、クラッシュログ出力を表示してください –

答えて

0

はまた、あなたのpresetNameとpresetParamをのNSLog、それらのいずれかがnilの値かどうかを確認[projectionPresets setValue: presetParam forKey: presetName];

を試してみてください。

5

犯人を見つけました。以下なステートメントは、NSUserDefaultsのドキュメントからです:NSUserDefaultsから返さ

値は不変で、あなたが値として 変更可能なオブジェクトを設定していても。たとえば、変更可能な文字列 を "MyStringDefault"の値として設定した場合、後でstringForKeyを使用して を取得する文字列は変更できません。

解決方法は、以前の変更可能なディクショナリから新しいプリセットディクショナリを作成し、それを修正してユーザーのデフォルト値と一緒に保存します。あなたが最初のその後だけではNSMutableDictionaryのためのsetObjectでき

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

をしなければならないNSMutableDictionaryにsetObjectにするには

-1

。変更可能な辞書は絶対に変更可能でなければなりません。

関連する問題