Получить значение Ivar из CGPoint в Objective-C - PullRequest
4 голосов
/ 31 мая 2010

Спасибо за просмотр моего вопроса.

Я пытался осмотреться, и я играл с игроками низкого уровня, чтобы получить информацию от классов. У меня возникают проблемы при попытке загрузить значения из CGPoint.

CGPoint point;   
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point);
NSLog(@"%@", NSStringFromCGPoint(point)); 

Вывод этого должен быть {220,180}

На самом деле я получаю {220, 1.72469e-38}

Может ли кто-нибудь помочь мне и объяснить, почему это может происходить?

Ответы [ 3 ]

1 голос
/ 10 августа 2010

Настоящая проблема здесь в том, что CGPoint не является объектом - это просто старая структура C. : -)

0 голосов
/ 25 сентября 2010

object_getInstanceVariable() копирует только указатель данных в начале смещения ивара. В конце концов, это все хранилище, которое вы ему даете с последним аргументом void **. Когда вы знаете, что у вас больше данных, чем указатель, как в этом случае, вы можете использовать ivar_getOffset(), чтобы найти, где начинаются данные, и скопировать столько байтов, сколько вам нужно:

Ivar iv = object_getInstanceVariable(obj, [columnName UTF8String], NULL);
ptrdiff_t offset = ivar_getOffset(iv);
CGPoint point = *(CGPoint *)((char *)obj + offset);

В этом случае разыменование CGPoint * приводит к копированию sizeof(CGPoint) байтов с указанного адреса; в общем случае вы можете memcopy() или bcopy() данные с вычисленного адреса в буфер соответствующего размера.

Следующая проблема - вычисление правильного размера во время выполнения ...

0 голосов
/ 31 мая 2010

Указатели здесь перепутаны. point является экземпляром, поэтому &point является указателем (void * -подобным), а не указателем на указатель (void ** -подобным) Вам нужно что-то вроде этого:

CGPoint *point;   
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point);
NSLog(@"%@", NSStringFromCGPoint(*point)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...