有没有办法在运行时在Cocoa / Cocoa Touch中为类的ivars动态分配或赋值?

时间:2013-05-15 08:53:57

标签: objective-c cocoa-touch cocoa objective-c-runtime

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

1 个答案:

答案 0 :(得分:1)

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

和ramblings ......

您可以使用运行时查找类的所有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)或更[obj setValue: @"woof" forKey:@"dog"]的最终方式,最终将无法设置iVar。

你可能做的事情,我过去必须做的就是反省属性列表:

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