2011-05-02 65 views
2

我已經移植了iPhone的庫(冰,NAT穿越),並遇到問題,而實際上在iPhone設備上測試它(版本4.3)。開發了與我的圖書館聯繫的可可觸摸包裝。庫例程從我的應用程序中放置的「測試」按鈕被調用。巨大的大小庫不加載在iphone

應用程序是.mm和庫是基於C++的。

下面是在我的應用程序失敗的情況下/經過

案例一:我「構建和調試」 /「構建並運行」從Xcode應用程序的iPhone。該應用程序在iphone上運行良好,我可以在我的Mac機上的控制檯上看到相同的日誌。案例二:我嘗試從我的iphone上運行應用程序,但它只是在打開時崩潰。案例三:我從Xcode構建和調試應用程序,啓動應用程序get。但只要我拔掉調試電纜(從我的Mac連接到iphone),應用程序就會崩潰。

應用程序的大小是16 MB,庫的大小是288 MB。

我試圖通過一個簡單的測試應用程序和一個測試庫來模擬相同的問題。它在所有情況下運行良好,沒有問題。可能是什麼問題?

  1. 看來,應用程序是映射從蘋果機上運行的Mac機庫代碼。一旦物理鏈接被破壞,應用程序崩潰。

  2. 庫的大小是巨大的?

在此先感謝

+0

爲了增加,我運行了otools -L來確認依賴關係,所有的二進制文件都是針對arm6和arm7架構的。 – RDX 2011-05-02 08:53:18

+0

你有堆棧跟蹤嗎? 288MB的編譯代碼非常多。我敢打賭,這與記憶有關。你有沒有嘗試過把小塊碎片拆下來,只加載你實際使用的部分? – 2011-05-02 12:25:52

+0

1.通過mac os x將調試電纜連接到iphone時,該應用程序可以在iPhone上正常工作。當我分離電纜時,該應用程序無法工作。所以我當時看不到堆棧跟蹤。 – RDX 2011-05-02 12:46:53

回答

3

的iOS應用程序殺死阻止主線程太久。所以這可能是問題,也解釋了爲什麼應用程序不會在調試模式下被殺死。

嘗試在後臺運行你的功能,看看是否有幫助!

+0

在觀察庫代碼時,它有一些全局變量intaniations,它們實際上是必需的。這實際上可能需要時間,這反過來阻礙了主線程。所以我認爲我們不能將該代碼放在後臺。有沒有其他的方式讓主線程等待而不是分解?我閱讀了關於大中央調度,可以使用嗎? – RDX 2011-05-03 09:14:17

+0

在'performSelectorInBackground:'後臺運行它應該工作得很好。當你需要做很重的事情時,你應該始終使用它。 GCD做同樣的事情,這應該不重要。 – 2011-05-03 09:29:44

+0

我在庫中有幾個頭文件,它又有一些全局變量。那些必須包括在內。這些實際上是爲主線程創建延遲。要調用的功能在一個按鈕下。所以即使我把這個函數放在後臺(使用performselectorinbackground),它也贏了;沒有幫助。我試着按照你的說法,但沒有幫助(理由:正如我所說,以上) – RDX 2011-05-03 09:40:49

0

最後我得到了我的問題的答案!感謝您指出「iOS版應用殺死阻止太久主線程」

以下是我跟着找到解決問題的方法有很多馬丁:

Xcode的「orgainzer」 - >「設備日誌「部分顯示iphone崩潰報告。我的應用程序崩潰報告也是以相同的方式生成的。

在崩潰報告中明確寫道「mytestapp未能及時發佈」,並進一步顯示API花費太長時間返回結果。 (在我的情況下它是getlocalhostname API)。

我剛剛根據我的要求更正了API,編譯並在iPhone設備上運行應用程序,它工作正常!此外,應用程序的啓動時間現在也少得多。

再次感謝!