Есть ли способ динамически распределять или присваивать значения ivars класса во время выполнения в Cocoa/Cocoa Touch?

Я уверен, что мы можем динамически определять iVars класса во время выполнения. Есть ли способ выделить определенные iVars во время выполнения? ТИА..


person Agarathi    schedule 15.05.2013    source источник


Ответы (1)


Короткий ответ, который вам, вероятно, нужен:
[obj setValue:@"woof" forKey:@"dog"];

а за болтовню...

вы можете с помощью среды выполнения найти все iVars класса с помощью:

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

eg:

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) это может быть полезно для копирования неизвестных объектов и для отладки.

person Grady Player    schedule 15.05.2013