2012-01-26 6 views
2

setValue:forKey:は、取り除かれているかのようにNULL値を扱います。キー値コーディング - setValue:forKey:値がNULLです

[myObj setValue:[aDictionary valueForKey:@"keyDoesNotExist"] forKey:@"anotherKey"];

コードのクラッシュのこの行をaDictionaryキーkeyDoesNotExistが含まれていない場合:しかし、私はそのようなことは一貫してクラッシュし、次のように例があります。その周りには何か方法はありますか?ここで適切なことは何ですか?

myObjはNSManagedObjectのインスタンスです。 "anotherKey"は、myObjが "anotherKey"の多くを含むことができる1対多の関係です。

答えて

6

setValue:forKey:をnil値でコールすると、-setNilValueForKey:メソッドが呼び出されます。デフォルトでは(NSObjectの実装では)無効な引数例外が発生します。 -setNilValueForKey:を無効にして、何でもしたいと思うようにすれば、無限の値で何か他のことをすることができます。

あなたが直接このmyobjのanotherKeyセッターを呼び出す場合あるいは、あなたは(当然のsetAnotherKey:の実装に依存)例外を取得しないでください。あなたが読んでいる

myObj.anotherKey = [aDictionary valueForKey:@"keyDoesNotExist"]; 

ドキュメントはNSMutableDictionaryのために、おそらくです。 setValue:forKey:のNSMutableDictionaryの実装は、値がnilの場合はremoveObjectForKey:を呼び出します。これはNSObjectのサブクラスには当てはまりません。私はこれがmyObjであると推測しています。

この現象は、NSKeyValueCoding Protocol Reference documentationで説明しています。

+0

ありがとうございます。私が先に進んでsetNilValueForKey:を定義したとしても、EXEC_BAD_ACCESSを取得しています。 aDictionaryは間違いなく存在し、そこに他のキーがありますが、keyDoesNotExistキーはありません。 – randombits

+1

私の答えは、あなたの質問にまだ追加していないので、myObjcがNSManagedObjectであるという事実を考慮しませんでした。つまり、EXC_BAD_ACCESSはメモリー管理エラーを示しています。これは、割り振り解除されたオブジェクトにメッセージを送信する(メソッドを呼び出す)ためです。言い換えれば、 'setValue:ForKey:'をnil値で呼び出す問題ではなく、おそらくメモリ管理の問題です。より多くのコードを見ることなく、診断することは不可能です。 Instruments 'Zombies instrumentを使用してプログラムを実行してみてください。 –

+0

NSZombieEnabledを、実行可能ファイルの環境変数としてYESの値で追加する必要があります。その後、コードを再実行します。ゾンビの場合は、コンソールに「 - [MyClass methodName]メッセージが割り当て解除されたインスタンスに送信されました」というエラーメッセージが表示されます。 – Roberto