Что происходит с динамическими средствами доступа ObjC в gdb? - PullRequest
1 голос
/ 16 ноября 2011

Я заметил, что пользовательские экземпляры подкласса NSManagedObject не отвечают на их методы доступа при вызове их из gdb.Мне всегда нужно вызывать valueForKey: и setValue:forKey:.

. Я предполагаю, что это как-то связано с их средствами доступа к свойствам, генерируемыми во время выполнения (у подклассов NSManagedObject есть свойства @dynamic для свойств)?Что именно происходит со средой выполнения ObjC при достижении точки останова в gdb?

Обратите внимание, что я пытаюсь получить свойства объекта, используя простой синтаксис обмена сообщениями, а не синтаксис точки.

1 Ответ

4 голосов
/ 21 декабря 2011

Gdb включает свой собственный код для разрешения реализации сообщений. Он знает о структуре объекта, обходит иерархию классов, разрешает селектор в IMP и вызывает его через собственный механизм. Я полагаю, что это так, поэтому он может делать такие вещи, как «шаг в», то есть перейти в реализацию и остановиться там (вместо того, чтобы прыгать в objc_msgSend и останавливаться там, чего вам не хотелось бы).

Поскольку NSManagedObject не синтезирует метод IMP, а использует динамическую диспетчеризацию и переадресацию для разрешения своих установщиков / получателей, gdb не может найти IMP и поэтому завершается ошибкой. Методы KVC предоставляются NSObject, поэтому они всегда есть; так как они выполняются нативно, они будут использовать надлежащий механизм диспетчеризации, который NSManagedObject затем использует для разрешения соответствующих средств доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...