2009-06-19 19 views
0

嗯,我有一個應用程序,我正在iPhone SDK 2.2中開發,最近我在3.0模擬器中構建並啓動了它。基本SDK仍然設置爲2.2。我想這會避免問題。相反,我得到EXC_BAD_ACCESS當將iPhone應用程序從2.2移動到3.0模擬器

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000a1b1c1f3 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x92f4b688 objc_msgSend + 24 
1 Foundation      0x305085bd -[NSCFString isEqualToString:] + 61 
2 HappyApp      0x00002c27 -[CombinationsTableViewController loadData] + 220 (CombinationsTableViewController.m:64) 

的崩潰是一個非常簡單的線條出現,其中totalUITextField

if (![total.text isEqualToString:@""]) { 

有沒有人遇到過嗎?我覺得這是一個線程爭用問題,或者我的整個應用程序沒有正確編譯。它適用於2.2.1模擬器。如果這不是在OS 3.0中測試2.2應用程序的方式,那麼除了切換下拉框之外,我該怎麼做?

更新:安德魯Pouliot是正確的,這是一個發佈的參考問題。調試器指向一行,所以我得到了錯誤的提示。罪魁禍首竟是這個第一行:

if(!([total.text isEqual:totalTextCache] 
    && [divisions.text isEqual:divisionsTextCache])) { 
    //Loads the data for the table only if the values were actually changed 
    totalTextCache = total.text; //ditto for divisions 
} 

這些生產線的totalTextCache的唯一用途,如果total.text改變它變得無效。 這從來沒有在2.2.1 sim中引起過問題,這可能是因爲舊的total.text在更改值時從未由運行時釋放。但是這個代碼是錯誤的。我固定它通過改變它做的正是我的isEqual以爲在做:

if(!(total.text==totalTextCache && divisions.text==divisionsTextCache)) 

因爲我其實沒有想複製NSString S,而只是檢查他們是否有改變(因此將參考這個工作原理在2.2.1運行環境中,錯誤的代碼運行良好,因爲舊的引用仍然可以檢查它的散列屬性並通過isEqual進行比較。

回答

1

當我安裝我的3.0 SDK時,我的2.0工具消失了,所以不知道這是否適用,但我不認爲模擬器的版本設計爲與未來的運行時間二進制兼容。

問題可能出在你的代碼上。如果是這樣,我可以說是你有一個內存管理問題,而不是「線程爭奪」。一切都發生在UIKit的主線程中(不是線程安全的)。

檢查您設置總變量的位置;它可能已經在你使用這種方法時被釋放。確保你的retainCount是合理的。

當你爲3.0構建時,你有同樣的錯誤嗎?

+0

我正在建設3.0。我沒有爲2.2.1編譯錯誤。我從來沒有發佈TextField這是一個IBOutlet,它是我唯一的觀點的一部分。另一個字符串是文字。調試器可能會在我的代碼中指出一點,看過幾次。 還要回到2.0工具,請轉到項目>編輯項目設置,在常規選項卡中將所有配置的基本SDK設置爲2.x SDK。 – dlamblin 2009-06-19 09:26:42

相關問題