Objective-C运行时:为class_addIvar添加大小和对齐的内容?

Objective-C Runtime提供了class_addIvar C函数 :

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

我对sizealignment什么alignment

我正在添加一个类型为UITextPosition *的实例变量,但是没有UITextPosition对象在范围内。 对于size ,我可以只做sizeof(self) ,其中selfUITextField的子类吗? 即,我可以假设UITextPosition对象与UITextField对象的大小相同吗?

如何alignment

关于这些东西的文档信息量不大,这反映出通常你不应该使用它。 但是,您可以要求对齐:

 char *texPosEncoding = @encode(UITextPosition); NSUInteger textPosSize, textPosAlign; NSGetSizeAndAlignment(textPosEncoding, &textPosSize, &textPosAlign); class_addIvar(yourClass, "yourIvarName", textPosSize, textPosAlign, textPosEncoding); 

所以,首先,最大的问题是’为什么’。 这只适用于您自己在运行时生成的类,您无法将ivars添加到现有类中。

有了这个,在你的情况下,你添加一个指针类型的ivar,这意味着它们都是相同的大小。 它的指针大小,而不是重要的对象的大小。

从您链接的文档中,您希望sizeof(UITextPosition*)sizeof(UITextPosition*)并且对齐为log2(sizeof(UITextPosition*))