Почему object_getIvar возвращает значение null?

Почему следующий код цели-c печатает имя: (null)
но если NSLog (@ "Название страны:% @", c.name); раскоментирован, тогда он печатает:
Название страны: США
имя: США

 Country *c = row;
 //NSLog(@"Country name : %@", c.name);
 Ivar ivar = class_getInstanceVariable([row class], "name");
 NSString *name = object_getIvar(row, ivar);
 NSLog(@"name : %@", name);
1
nl ja de
попытайтесь приостановить выполнение.
добавлено автор Anoop Vaidya, источник
Пауза Кажется, что выполнение выполнено -> если я поместил его в UITable и получим доступ к нему позже, он будет работать
добавлено автор Thorsten Niehues, источник
что, если вы используете object_getInstanceVariable напрямую?
добавлено автор cocoafan, источник

3 ответы

Возможно, свойство name поддерживается резервной копией с автогенерированным именем _name . Пытаться

Ivar ivar = class_getInstanceVariable([row class], "_name");

вместо.

1
добавлено
"_name" не работает
добавлено автор Thorsten Niehues, источник

В документах говорится:

object_getIvar быстрее, чем object_getInstanceVariable, если Ivar для переменной экземпляра уже известен.

Это означает, что, возможно, ваш «ivar» должен быть «известен». Это объясняет, почему он правильно печатается после того, как он был извлечен в вашем журнале. Перейдите с помощью object_getInstanceVariable .

Обратите внимание, что в документации также указано следующее. У вас будет настоящая веская причина попасть в этот материал низкого уровня:

Эта ссылка полезна в первую очередь для разработки мостов между объектами-C и другими языками или для низкоуровневой отладки. Обычно вам не нужно использовать библиотеку времениobjective-cнепосредственно при программировании в Objective-C.

0
добавлено
@ H2CO3 Да, но это подсказка, и ответ включает рабочее решение.
добавлено автор Mundi, источник
Возможно, с именем [(Страна *)]; ? В документации явно указано, что вам не нужны эти функции при программировании цели-c - только если вы хотите написать «мостовые слои».
добавлено автор Mundi, источник
Я не могу использовать эту функцию из-за ARC: «object_getInstanceVariable» недоступен: недоступен в режиме автоматического подсчета ссылок
добавлено автор Thorsten Niehues, источник
Любой другой способ сделать его известным?
добавлено автор Thorsten Niehues, источник
Ссылка Runtimeobjective-cне предоставляет широкого спектра приложений, для которых может быть использовано время выполнения. Уobjective-cесть слабые способности к самоанализу; для заполнения таких пробелов можно использовать хорошо осведомленное и тщательное использование среды выполнения.
добавлено автор ctpenrose, источник
Я бы не сказал, что быстрее, если X подразумевает , он не работает, если! X ...
добавлено автор user529758, источник

Я избегаю этой проблемы, используя свойства вместо iVars. Затем вы можете использовать setValue: forKey: и valueForKey: , чтобы получить и установить свойства.

Вот документация Apple:

https://разработчик. apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

0
добавлено