iPhone OS上结构对齐的确切规则是什么?

时间:2008-10-22 06:48:18

标签: iphone objective-c

我正在使用Objective-C NSMethodSignature / @encode工具进行一些跨语言数据类型转换,这意味着我需要能够以编程方式将值复制到以@encode()格式描述的结构中。例如,我可能有4个浮点数并且需要将它们插入到CGRect中,CGRect是一个包含2个结构的结构,每个结构包含2个浮点数。在@encode术语中,类型为:

{CGRect={CGPoint=ff}{CGSize=ff}}

要做到这一点,我需要能够猜测结构布局,只知道原始结构成员的数据类型 - 在这种情况下是4个浮点数。

从历史上看,ARM结构对齐有两种不同的约定。一种是将结构的所有成员对齐在一个满足最大成员的边界大小上。另一种方法是将所有成员对齐到适合每个成员数据类型的边界大小。

在OS X / iPhone OS上,在ARM和x86 / x86_64上使用哪个?

1 个答案:

答案 0 :(得分:1)

如果您只是想编码CGRect,您可能应该为NSCoder -encodeCGRect使用UIGeometryKeyedCoding类别添加:forKey:。

如果您想在系统之间进行操作,可以考虑使用NSRectFromCGRect()将CGRect转换为NSRect,然后使用-encodeValueOfObjCType对NSRect进行编码:at:。

如果您想要对其他C结构进行编码,Apple在标有“编码和解码C数据类型”的文档中列出了非常明确的策略。正如它在“结构和位域”中所述,“存档结构或位域集合的最佳技术是独立存档字段,并为每个字段选择适当类型的编码/解码方法。”