#objective-c #ios #gdb
#objective-c #iOS #gdb
Вопрос:
У меня есть класс Song, который относится к подклассу NSManagedObject. Я использую GDB, чтобы попытаться решить проблему, с которой я столкнулся, и мне трудно вызвать средство доступа в моем классе с помощью gdb.
Song.h:
@property (nonatomic, retain) NSString * title;
Song.m:
@dynamic title;
В отладчике я вижу поле «title» объекта, когда я пытаюсь напечатать значение с помощью средства доступа, которое должно быть сгенерировано во время выполнения, если я правильно понимаю, это выдает мне ошибку:
(gdb) po aSong <Song: 0x59188d0>
(entity: Song; id: 0x59162d0
<x-coredata://99BE63F8-840A-47B5-A259-BCD74E1811C4/Song/p2>
; data: {
composers = "<relationship fault: 0x4d62f30 'composers'>";
dateCreated = nil;
songLists = "<relationship fault: 0x59243c0 'songLists'>";
title = "cancel?"; })
(gdb) p aSong.title There is no member named
title.
(gdb) p [aSong title]
Target does not respond to this message selector.
Скорее всего, я делаю здесь что-то действительно глупое, но что я делаю не так? Есть ли какой-либо способ проанализировать объект и посмотреть, на какие сообщения он будет реагировать, используя GDB?
Комментарии:
1. Вы пробовали
p aSong->title
?
Ответ №1:
Вы можете получить доступ к динамически генерируемым свойствам в, gdb
используя valueForKey:
метод, как в [aSong valueForKey:@"title"]
. (Этот метод работает и для синтезированных свойств, если вы мазохист, но на самом деле он пригодится только при проверке NSManagedObject
и его подклассов.)
Ответ №2:
К сожалению, так gdb
себя ведет. Вместо того, чтобы спрашивать объект, будет ли он реагировать на селектор, похоже, он просто смотрит на реализацию объекта либо сейчас, либо во время компиляции (я еще не разобрался, что именно). Поскольку атрибуты Core Data обрабатываются в процессе пересылки сообщения, отладчик не верит, что это NSManagedObject
будет реагировать на селекторы атрибутов.
Вероятно, об этом стоит сообщить Apple как об ошибке, чтобы они могли исправить отладчик.
Комментарии:
1. спасибо, я подтвердил это с помощью инструкции NSLog (с которой мне, вероятно, следовало начать).