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)
我对size
和alignment
什么alignment
?
我正在添加一个类型为UITextPosition *
的实例变量,但是没有UITextPosition
对象在范围内。 对于size
,我可以只做sizeof(self)
,其中self
是UITextField
的子类吗? 即,我可以假设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*))