我注意到,從GDB調用時,爲其量身定製的NSManagedObject
子類的實例沒有自己的存取響應。我總是需要撥打valueForKey:
和setValue:forKey:
。gdb中的ObjC運行時和動態訪問器會發生什麼?
我認爲這與他們在運行時生成的屬性訪問器有關(NSManagedObject
子類具有@dynamic
屬性訪問器)?當斷點在gdb中被擊中時,ObjC運行時會發生什麼?
請注意,我試圖用簡單的消息語法來獲取對象的屬性,而不是點語法。
我注意到,從GDB調用時,爲其量身定製的NSManagedObject
子類的實例沒有自己的存取響應。我總是需要撥打valueForKey:
和setValue:forKey:
。gdb中的ObjC運行時和動態訪問器會發生什麼?
我認爲這與他們在運行時生成的屬性訪問器有關(NSManagedObject
子類具有@dynamic
屬性訪問器)?當斷點在gdb中被擊中時,ObjC運行時會發生什麼?
請注意,我試圖用簡單的消息語法來獲取對象的屬性,而不是點語法。
GDB包括它自己的代碼來解決信息實現。它知道對象的結構,遍歷它的類層次結構,將選擇器解析爲IMP並通過它自己的機制調用它。我相信它確實是這樣它可以做的東西,如「步入」,即跳進實現和停在那裏(而不是跳進objc_msgSend
並停止在那裏,你不會想)。
因爲NSManagedObject不合成方法的IMP,而是使用動態調度和轉發,以解決其制定者/吸氣,GDB找不到的IMP,所以失敗。 KVC方法由NSObject提供,所以它們始終存在;因爲它們本地執行,所以它們將使用適當的調度機制,NSManagedObject隨後使用它來解析適當的訪問器。