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()
данные с вычисленного адреса в буфер соответствующего размера.
Следующая проблема - вычисление правильного размера во время выполнения ...