为什么object_getIvar返回null?

时间:2013-01-29 09:58:35

标签: objective-c null

为什么以下Objective-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);

3 个答案:

答案 0 :(得分:1)

可能属性name由名为_name的自动生成的实例变量支持。尝试

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

代替。

答案 1 :(得分:0)

在文件中说明:

  

如果实例变量的Ivar已知,则object_getIvar比object_getInstanceVariable快。

这意味着您的ivar可能需要“知道”。这可以解释为什么在日志语句中检索后它会正确打印。使用object_getInstanceVariable

请注意,文档还说明了以下内容。你必须有一个真正的理由来进入这个低级别的东西:

  

此参考主要用于在Objective-C和其他语言之间开发桥接层,或用于低级调试。在Objective-C中编程时,通常不需要直接使用Objective-C运行时库。

答案 2 :(得分:0)

我通过使用属性而不是iVars来避免此问题。然后,您可以使用setValue:forKey:valueForKey:来获取和设置属性。

以下是Apple文档:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html