Как получить значение int из object_getIvar (self, myIntVar), так как оно возвращает указатель - PullRequest
7 голосов
/ 01 августа 2009

если переменная в object_getIvar является базовым типом данных (например, float, int, bool), как я могу получить значение, поскольку функция возвращает указатель (id) в соответствии с документацией. Я пытался привести к int, int *, но когда я пытаюсь получить его в NSLog, я получаю сообщение об ошибке несовместимого типа указателя.

Ответы [ 5 ]

6 голосов
/ 02 августа 2009

Начало

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

3 голосов
/ 26 августа 2013

для дуги:

Вдохновленный этим ответом: object_getIvar не может прочитать значение BOOL iVar . Вы должны вызвать вызов функции для object_getIvar, чтобы получить ivars базового типа.

typedef int (*XYIntGetVariableFunction)(id object, const char* variableName);
XYIntGetVariableFunction intVariableFunction = (XYIntGetVariableFunction)object_getIvar;
int result = intVariableFunction(object, intVarName);

Я сделал небольшой полезный макрос для быстрого определения таких указателей на функции:

#define GET_IVAR_OF_TYPE_DEFININTION(type, capitalized_type) \
typedef type (*XY ## capitalized_type ## GetVariableFunctionType)(id object, Ivar ivar); \
XY ## capitalized_type ## GetVariableFunctionType XY ## capitalized_type ## GetVariableFunction = (XY ## capitalized_type ## GetVariableFunctionType)object_getIvar;

Затем для базовых типов вам нужно указать вызовы к макросу (например, параметры будут соответствовать (long long, LongLong)):

GET_IVAR_OF_TYPE_DEFININTION(int, Int)

И после этого становится доступной функция для получения типа переменной int (или указанного):

int result = XYIntGetVariableFunction(object, variableName)
2 голосов
/ 01 августа 2009

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

(int)object_getIvar(obj, myIntVar)
0 голосов
/ 01 августа 2009

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

void *ptr_to_result;
object_getInstanceVariable(obj, "intvarname", &ptr_to_result);
float result = *(float *)ptr_to_result;
0 голосов
/ 01 августа 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...