Objective-C Runtime: что положить для размера и выравнивания для class_addIvar? - PullRequest
4 голосов
/ 30 октября 2011

Objective-C Runtime предоставляет функцию class_addIvar C :

BOOL class_addIvar(Class cls, const char *name, size_t size, 
                   uint8_t alignment, const char *types)

Что мне поставить на size и alignment?

Я добавляю переменную экземпляра типа UITextPosition *, но объект UITextPosition не находится в области видимости. Для size я могу просто сделать sizeof(self), где self является подклассом UITextField? Т.е. можно ли предположить, что объект UITextPosition имеет такой же размер, как объект UITextField?

Как мне получить alignment?

Ответы [ 2 ]

7 голосов
/ 24 января 2012

Документация по этому материалу не очень информативна, что говорит о том, что, как правило, ее не следует использовать. Тем не менее, вы можете попросить выравнивание:

char *texPosEncoding = @encode(UITextPosition);
NSUInteger textPosSize, textPosAlign;
NSGetSizeAndAlignment(textPosEncoding, &textPosSize, &textPosAlign);
class_addIvar(yourClass, "yourIvarName", textPosSize, textPosAlign, textPosEncoding);
4 голосов
/ 30 октября 2011

Итак, прежде всего, главный вопрос - «почему».Это работает только с классами, которые вы генерируете во время выполнения самостоятельно, вы не можете добавлять ivars к существующим классам.

При этом в вашем случае вы добавляете ivar, который является типом указателяэто означает, что они все одного размера.Это размер указателя, а не размер объекта, который имеет значение.

Из документации, которую вы связали, вы хотите размер как sizeof(UITextPosition*) и выравнивание как log2(sizeof(UITextPosition*))

...