2012-06-05 82 views
0

我做了一個通用的應用程序,包含ipad和iphone用戶界面的NIB文件。在我看來控制器的initWithNibName方法我打電話UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()來檢測控制器是否在iPhone或iPad上運行。在iPhone上運行的Xcode應用程序,但在Ipad上崩潰

然後我啓動它們各自的nib文件。當我在iphone上運行應用程序時,它運行良好,但是當我在ipad上運行它時,它最終會崩潰,並顯示EXC_BAD_ACCESS錯誤。當我使用視圖控制器啓動另一個視圖控制器,然後在導航堆棧中啓動另一個視圖控制器時,會發生此錯誤。只要我點擊屬於堆棧第三個控制器的視圖,就會發生此錯誤。

我無法區分可導致崩潰的NIB文件之間的差異。我一直在不知疲倦地弄清楚爲什麼會發生這種情況,但我無法解決這個錯誤。有沒有人對可能發生的事情有所瞭解?

任何關於如何解決這個問題的建議將非常感激。

+0

這是否發生在設備和模擬器上?如果在啓用下面提到的所有異常之後仍然沒有可用的信息,那麼在[對象描述]中繼續大量的NSLog(),直到找到一個爲零的。 –

回答

2

您應該做的第一件事是啓用「所有異常」斷點。這通常會準確地告訴您EXC_BAD_ACCESS正在發生的代碼行。

enter image description here

接下來,我會變成殭屍,看看那裏的過度釋放發生。爲此,在Xcode中,按住選項鍵的同時,單擊Product |運行....在隨後的窗口中,將NSZombieEnabled添加到環境變量列表中。

enter image description here

然後運行。執行正常的事情來引起崩潰並查看調試器的着陸點。如果運氣好的話,它會停止問題實際發生的地方。

當你得到一個EXC_BAD_ACCESS時,這意味着你正試圖訪問/發佈已經發布的東西。如果你處於非ARC環境中,通常意味着你不經意地發佈了某些東西,所以只需檢查alloc/init並釋放餘額。但是,如果您處於ARC環境中,我敢打賭,它與視圖控制器發佈時不委託委託人有關。

例如,如果你有一個的MKMapView,並設置其委託給您的視圖控制器,你應該爲零其委託時,你的觀點被卸載或dealloc'd。否則,消息將繼續被設置。或者,另一種可能是您已將視圖控制器添加爲NSNotificationCenter觀察器,並且在視圖控制器被卸載或釋放時並未將其作爲觀察者移除。

另一種可能是您在通用應用程序的兩個版本之間重新使用視圖控制器。如果您正在使用iPad中筆記本中不存在的標識符訪問任何內容,則會導致崩潰 - 儘管如果您使用筆尖而不是故事板,那可能不是問題。

這就是我現在所能想到的。嘗試將它發生的地方歸零,並在這裏發佈代碼,如果你仍然無法弄清楚。

此致敬禮。

+0

非常感謝,非常有幫助的迴應。我終於弄明白了。乾杯。 – Andrew

相關問題