为什么以下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);
答案 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文档: