2008-10-22 53 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