2012-04-21 10 views
9

NSMutableDictionaryからオブジェクトを削除しようとすると、例外が発生します。関連するコードは次のとおりです。 「設定」はメソッドに渡され、NSDictionaryまたはNSMutableDictionaryになります。変更可能な辞書からオブジェクトを削除すると、例外がスローされます

NSMutableDictionary *mutableSettings = nil; 
if ([settings isKindOfClass:[NSMutableDictionary class]]) 
    mutableSettings = (NSMutableDictionary *)settings; 
else 
    mutableSettings = [[[NSMutableDictionary alloc] initWithDictionary:settings] autorelease]; 

[mutableSettings removeObjectForKey:@"akey"]; 

これがキャッチされない例外により 'NSInternalInconsistencyException'、理由にアプリを終了*

でクラッシュ: ' - [__ NSCFDictionary removeObjectForKey:]:不変オブジェクトに送られた変異法'

何が問題ですか?ありがとう。

答えて

10

問題ここではNSDictionaryは、クラスクラスタであるという事実によるそのclassとしてその両方NSDictionaryNSMutableDictionaryリターン__NSCFDictionary、です。

settings辞書の可変コピーを作成するだけで、それが可変であるかどうかはわかりません。

NSMutableDictionary *mutableSettings = [settings mutableCopy]; 
+3

また、下線が示すように、 '__NSCFDictionary'はプライベートクラスです。それは必ずしも唯一の辞書クラスではなく、永遠に周りにいることは保証されていません。より関連して、それはNSMutableDictionaryのサブクラスなので、*すべての*辞書(それは '__NSCFDictionary'のインスタンスです)はNSMutableDictionaryの一種です。これらのすべては、辞書(または他のplistオブジェクト)が可変であるかどうかを確かめる方法がないことを意味します。 –

関連する問題