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