почему отладчик не осведомлен о методах в моих классах управляемых объектов, генерируемых базовыми данными? (код прилагается) - PullRequest
3 голосов
/ 09 апреля 2011

Почему отладчик не осведомлен о методах в моих классах управляемых объектов, генерируемых базовыми данными? (код прилагается) Итак:

  • У меня есть класс объектов управляемых базовых данных, созданный в XCode, с именем WEView
  • Я заметил, что отладчик, похоже, не знает о своих методах?
  • См. Ниже в выводе консоли. Кажется, что первоначальный «po self.weView» работает, но затем при обращении к какой-либо из переменных экземпляра объекта это не так?

Консольный вывод

(gdb) po self.weView
<WEView: 0x4f6a3f0> (entity: WEView; id: 0x4f68710 <x-coredata://CB3E1660-4BA8-4700-ADDB-A32CD44D56B6/WEView/p3> ; data: {
    title = "Weekend Items";
    weEndDayTime = "(...not nil..)";
    weStartDayTime = "(...not nil..)";
})
(gdb) po self.weView.title
There is no member named title.
(gdb) po [self.weView title]
Target does not respond to this message selector.
(gdb) 
Заголовок

- производится Xcode

@interface WEView : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) id weStartDayTime;
@property (nonatomic, retain) id weEndDayTime;

@end

1 Ответ

9 голосов
/ 09 апреля 2011

Это потому, что на самом деле нет ивара с названием title, а также нет пары getter или setter. Вот почему вы используете @dynamic, а не @synthesize. Когда вы получаете доступ, например. название, это будет примерно так:

[myObject valueForKey:@"title"];

Аналогично, установка заголовка выглядит примерно так:

[myObject setValue:foo forKey:@"title"];

Таким образом, по сути, NSManagedObject является просто оболочкой для извлечения из базы данных или доступа из кэша, но вы никогда не получите доступ к некоторым реальным иварам объекта (вы можете попробовать функции времени выполнения для определения иваров подкласса NSManagedObject).

Если вы все еще хотите использовать [self.view title], вам нужно перезаписать его. Вот пример:

- (NSString *)title
{
   NSString *value;
   [self willAccessValueForKey:@"title"];
   value = [self primitiveValueForKey:@"title"];
   [self didAccessValueForKey:@"title"];

   return value;
}

Конечно, это не атомный геттер и он медленнее обычного, но эй, это работает.

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