2009-11-23 89 views
2

我引用了兩個靜態庫。我在調試模擬器模式下構建它們,並且與我的應用程序一起運行良好。然後我創建debug-iphone構建並將我的應用程序推送到設備。它打破了這個錯誤:爲什麼設備和模擬器的構建有所不同?

終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因: '*** - [NSCFString sizeWithCGFont:的pointsize:constrainedToSize:]:無法識別的選擇發送到實例0x24320'

然後SIGABRT錯誤顯示。

爲什麼在模擬器上工作正常,只能在設備上顯示?

- 編輯 -

終於想出了一個解決辦法,至少在設備上運行,但現在不是模擬器。拋出異常的方法是我用於字體的類。它是staticLibA的一部分,例如,這是有問題的庫。我在目標應用程序中包含了staticLibA作爲參考,還包括了問題類的.m文件。我已經引用了它的頭文件,這是NSString中的一個類別。這就是爲什麼直到我包含.m文件纔有效嗎?

如果我嘗試在模擬器中運行它,上面的類的構建輸出文件夾中出現重複的對象錯誤。

回答

2

我不能告訴你爲什麼你的問題只是在設備上顯示自己 - 也許你需要清理這兩個版本,並嘗試重新編譯它們?

在任何情況下,顯示的異常消息都是完全有效的。沒有(公共)方法名爲-[NSString sizeWithCGFont:pointSize:constrainedToSize:]。你是否試圖在NSString的任何地方調用sizeWithFont:方法之一?

編輯:看起來像sizeWithCGFont:pointSize:constrainedToSize:來自cocos-2d,我猜測會是你的靜態庫之一。模擬器和設備構建之間的主要區別在於構建架構 - 模擬器的架構是您自己的機器(i386)的架構,而設備構建是針對armv6或armv7。你確定你的靜態庫是爲適合的架構而構建的嗎?

+0

謝謝。我沒有使用cocos2d。這兩個庫是我創建的。我注意到問題庫中它的調試設備版本是爲i386設置的。我將其改爲與工作庫相同 - arm6/7。這沒有幫助。然後我注意到優化級別設置爲「最快,最小」,而工作庫設置爲「無」。我會試一試並回傳結果。 – 4thSpace 2009-11-23 16:55:49

+0

優化更改沒有做任何事情。仍拋出異常。 – 4thSpace 2009-11-23 22:56:25

0

由於您的計算機位於x86(或x86_64)體系結構上,所以模擬器構建是針對英特爾平臺編譯的。

該設備構建編譯到arm6(或arm7)體系結構。

您不能使用一個已編譯爲另一個的庫。每個彙編代碼都不兼容。

0

我有這個問題,當我不正確地釋放對象時出現。所以我會有一個指向未分配對象的指針。所以當我在對象上調用函數時,會說我正在調用NSCFString對象上的函數。可能是因爲內存被重新用於NSString對象。我通過尋找我的額外版本並將其刪除來修復它。

+0

無論您是在模擬器還是設備上,都應該顯示該問題。我在啓動時遇到錯誤。 – 4thSpace 2009-11-24 04:01:10

相關問題