Как я получаю международное значение от object_getIvar (сам, myIntVar), поскольку это возвращает указатель

Я думаю глагол, который Вы хотите, 'сочиняют'.

7
задан Russel West 1 August 2009 в 18:11
поделиться

4 ответа

Получение :

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

6
ответ дан 7 December 2019 в 03:18
поделиться

Возвращаемое значение - это значение из нужного места в объекте; просто не тот типаж. Для int и BOOL (но не float ) вы можете просто привести указатель к int или BOOL ], поскольку указатели и целые числа имеют одинаковый размер и могут быть преобразованы друг в друга:

(int)object_getIvar(obj, myIntVar)
2
ответ дан 7 December 2019 в 03:18
поделиться

Вероятно, это упаковка значения в NSNumber. Вы можете проверить это с помощью NSLogging возвращенного идентификатора className, например:

id returnedValue = object_getIvar(self, myIntVar);
NSLog(@"Class: %@", [returnedValue className]);

Изменить: я нашел еще один вопрос, похожий на этот здесь: Обработка возвращаемого значения object_getIvar (id object, Ivar ivar)

Из моего собственными экспериментами, может показаться, что мое первоначальное предположение было неверным. int, float и другие примитивы возвращаются как фактическое значение. Однако было бы целесообразно использовать ivar_getTypeEncoding для проверки того, что возвращаемое значение является типом, который вы '

-1
ответ дан 7 December 2019 в 03:18
поделиться

вы можете использовать object_getInstanceVariable напрямую: (не тестировал)

void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;
-1
ответ дан 7 December 2019 в 03:18
поделиться