我确信我们可以在运行时动态确定类的iVars。有没有办法在运行时分配确定的iVars? TIA ..
答案 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)
这对于复制未知对象和调试非常有用。