2011-10-29 21 views
4

Objective-C Runtime provides the class_addIvar C functionObjective-C运行时:为class_addIvar放置尺寸和对齐的内容?

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

我该怎么把为sizealignment

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

我该如何获得alignment

回答

4

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

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

从此你链接的文档,你想大小sizeof(UITextPosition*)和对齐方式为log2(sizeof(UITextPosition*))

+0

谢谢你,是的,我意识到我实际上没有增加伊娃无论如何,因为我只注意到'UITextInput'有一个'beginningOfDocument'伊娃,而这正是我想要的。所以,我会用它。但是,这很了解。谢谢!我明白你是怎么想出'尺寸'的,但你是怎么想到'对齐'的?为什么它是log2的大小? – ma11hew28

+0

它是log2,因为'class_addIvar'确实有'1 << align',这相当于'pow(2,align)'。请参阅['class_addIvar'手册](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/c/func/class_addIvar)。 –

7

对这个东西的文档不是非常丰富,这也反映了一般你不应该使用它来。但是,你可以要求对齐:

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

被引用的对齐是ivar的数据结构对齐,而不是任何UI对齐。完全不同的东西,所以这段代码是完全错误的。请参阅https://en.wikipedia.org/wiki/Data_structure_alignment – rpj

+0

此处的代码指的是对“UITextPosition”对象的伊娃引用的数据结构对齐。这里没有用户界面对齐。 –

相关问题