2011-11-16 4 views
1

私はカスタムNSManagedObjectのサブクラスインスタンスがgdbから呼び出す際にアクセサーに応答しないことに気付きました。私はいつもvalueForKey:setValue:forKey:と呼ぶ必要があります。gdbのObjCランタイムとダイナミックアクセサにはどうなりますか?

これは、実行時にプロパティのアクセサが生成されることと関連しています(NSManagedObjectサブクラスにはプロパティのアクセッサが@dynamicあります)。ブレークポイントがgdbでヒットしたとき、ObjCランタイムにはどうなりますか?

ドットシンタックスではなく、単純なメッセージング構文を使用してオブジェクトのプロパティを取得しようとしています。

答えて

4

Gdbには、メッセージの実装を解決するための独自のコードが含まれています。オブジェクトの構造を把握し、クラス階層を歩み、セレクタをIMPに解決し、それを独自のメカニズムを介して呼び出します。私はそれがそうすることで、 "ステップイン"のようなことをすることができる、つまり実装にジャンプしてそこに停止する(objc_msgSendにジャンプし、そこに停止するのではなく)。

NSManagedObjectはメソッドIMPsを合成せず、動的ディスパッチと転送を使用してsetter/getterを解決するため、gdbはIMPを見つけることができないため、失敗します。 KVCメソッドはNSObjectによって提供されるので、常にそこにあります。それらはネイティブに実行されるため、NSManagedObjectが適切なアクセサを解決するために使用する適切なディスパッチメカニズムを使用します。

関連する問題