我正在使用 Objective-C NSMethodSignature/@encode 工具进行一些跨语言数据类型转换,这意味着我需要能够以编程方式将值复制到以 @encode() 格式描述的结构中。例如,我可能有 4 个 float ,需要将它们插入 CGRect,这是一个包含 2 个结构的结构,每个结构包含 2 个 float 。在@encode 术语中,类型是这样的:
{CGRect={CGPoint=ff}{CGSize=ff}}
为此,我需要能够仅知道基本结构成员的数据类型来猜测结构布局——在本例中为 4 个 float 。
似乎历史上有两种不同的 ARM 结构对齐约定。一种是将结构的所有成员对齐到满足最大成员的边界大小。另一个是将所有成员对齐到适合每个成员数据类型的边界大小。
在 ARM 和 x86/x86_64 上的 OS X/iPhone OS 中使用哪个?
最佳答案
如果您只是想对 CGRect 进行编码,您应该使用 NSCoder -encodeCGRect:forKey: 的 UIGeometryKeyedCoding 类别添加。
如果您想在系统之间切换,您可以考虑使用 NSRectFromCGRect() 将 CGRect 转换为 NSRect,然后使用 -encodeValueOfObjCType:at: 对 NSRect 进行编码。
如果您想对其他 C 结构进行编码,Apple 在标有“编码和解码 C 数据类型”的文档中列出了非常明确的政策。正如它在“结构和位字段”下所述,“归档结构或位字段集合的最佳技术是独立归档字段并为每个字段选择适当类型的编码/解码方法。”
关于iphone - iPhone OS 上结构对齐的确切规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/224701/