Получение :
myFloat = 2.34f;
float myFloatValue;
object_getInstanceVariable(self, "myFloat", (void*)&myFloatValue);
NSLog(@"%f", myFloatValue);
Вывод:
2.340000
Настройка :
float newValue = 2.34f;
unsigned int addr = (unsigned int)&newValue;
object_setInstanceVariable(self, "myFloat", *(float**)addr);
NSLog(@"%f", myFloat);
Выходы:
2.340000
Возвращаемое значение - это значение из нужного места в объекте; просто не тот типаж. Для int
и BOOL
(но не float
) вы можете просто привести указатель к int
или BOOL
], поскольку указатели и целые числа имеют одинаковый размер и могут быть преобразованы друг в друга:
(int)object_getIvar(obj, myIntVar)
Вероятно, это упаковка значения в NSNumber. Вы можете проверить это с помощью NSLogging возвращенного идентификатора className, например:
id returnedValue = object_getIvar(self, myIntVar);
NSLog(@"Class: %@", [returnedValue className]);
Изменить: я нашел еще один вопрос, похожий на этот здесь: Обработка возвращаемого значения object_getIvar (id object, Ivar ivar)
Из моего собственными экспериментами, может показаться, что мое первоначальное предположение было неверным. int, float и другие примитивы возвращаются как фактическое значение. Однако было бы целесообразно использовать ivar_getTypeEncoding для проверки того, что возвращаемое значение является типом, который вы '
вы можете использовать object_getInstanceVariable
напрямую: (не тестировал)
void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;