2

我确信我们可以在运行时动态确定类的 iVar。有没有办法在运行时分配确定的 iVar?蒂亚..

4

1 回答 1

1

简短的答案和您可能想要的答案是:
[obj setValue:@"woof" forKey:@"dog"];

和闲逛...

您可以使用运行时找到一个类的所有 iVar:

Ivar * class_copyIvarList(Class cls, unsigned int *outCount)

例如:

id someObj; //assigned elsewhere
unsigned int count = 0;
Ivar * iVarList = class_copyIvarList([someObj class],&count);
for(;count>0;count--)
{
    Ivar testVar = iVarList[count]; 
    //do something with test Ivar
}
free(iVarList);

我几乎可以肯定,除非在调试场景中,否则您永远不会想要这样做……内省私有框架等。

或者,如果您知道 iVar 的名称,您可以使用:
Ivar object_setInstanceVariable(id obj, const char *name, void *value)或者更 objc 的方式[obj setValue: @"woof" forKey:@"dog"]最终将无法设置 iVar。

您可能会做的,而我过去必须做的是内省属性列表:

类似的调用:objc_property_t * class_copyPropertyList(Class cls, unsigned int *outCount)这对于复制未知对象和调试很有用。

于 2013-05-15T13:49:06.110 回答