2008-10-22 47 views
4

我正在使用Objective-C NSMethodSignature/@encode工具来执行一些跨语言数据类型转换,这意味着我需要能够以编程方式将值复制到以@encode()格式描述的结构中。例如,我可能有4个浮标,需要将它们插入到一个CGRect中,该CGRect是一个包含2个结构的结构,每个结构每个包含2个浮点。在@encode术语中,类型是这样的:iPhone OS上的结构对齐的确切规则是什么?

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

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

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

在ARM和x86/x86_64上的OS X/iPhone OS中使用哪种?

+0

我误解了你正在尝试做的事情,并在仔细检查后发现我仍然没有很好的把握。你能解释更多关于你如何尝试使用这些信息吗?你是否试图动态创建另一种语言的结构?你是否试图将数据从一个移动到另一个? – 2008-10-22 17:51:14

回答

1

如果你只是想编码CGRect,你应该使用NSCoder -encodeCGRect:forKey:的UIGeometryKeyedCoding类别。

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

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

+0

有趣,并感谢您的答案。但是我只需要使用从@encode()字符串得到的信息找到所有结构类型的一般答案 - 例如,没有关于NSRect和CGRect之间的等价性的知识,没有每个结构类型的自定义代码等等。 – 2008-10-22 16:35:20