1

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

3 回答 3

1

也许该属性name由一个名为_name. 尝试

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

反而。

于 2013-01-29T10:07:52.490 回答
0

在文档中它指出:

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

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

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

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

于 2013-01-29T10:10:23.697 回答
0

我通过使用属性而不是 iVar 来避免这个问题。然后您可以使用setValue:forKey:andvalueForKey:来获取和设置属性。

这是苹果文档:

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

于 2013-01-31T07:35:43.017 回答