2009-01-24 124 views
2

我碰到這個問題,我的應用程序得到EXC_BAD_ACCESS錯誤和阻塞/停止。我正在使用模擬器的「向左旋轉」&「向右旋轉」選項來模擬方向更改行爲。可能是這個錯誤的可能原因是什麼?由於我沒有得到有關錯誤的詳細信息,因此我無法追蹤它。iPhone開發 - 當我改變方向時,我的應用程序崩潰

我所有的控制器類有:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); // Return YES for supported orientations 
} 

任何想法,指針?謝謝。


但是我的代碼沒有調用[UIDevice setOrientation:]方法。

這是我得到的調試窗口跟蹤:

objc_msgSend 
-[UIWindow _handleDeviceOrientationChange:] 
_nsnote_callback 
__CFXNotificationPost 
_CFXNotificationPostNotification 
-[NSNotificationCenter postNotificationName:object:userInfo:] 
-[UIDevice setOrientation:] 
-[UIApplication handleEvent:withNewEvent:] 
_[UIApplication sendEvent:] 
_UIApplicationHandleEvent 
SendEvent 
PurpleEventTimerCallBack 
CFRunLoopRunSpecific 
CFRunLookRunInMode 
GSEventRunModel 
GSEventRun 
-[UIApplication _run] 
UIApplicationMain 
main 

需要注意的是,當我的視圖包含一個標籤欄會出現錯誤。由於沒有人回覆,我想這不是一個常見問題,我找不到解決此問題的任何資源。

我可以以某種方式告訴我的應用程序以單向(人像)運行,並且不發送事件以改變方向。這可能會解決我的問題,但這是我正在尋找的替代品。


感謝保羅,您的評論是有幫助的,我是能夠解決這一問題,但有保留的觀點我並不需要存儲的成本。這裏發生了什麼事情:

我有一個視圖(視圖A),它打開另一個視圖(視圖B)。應用程序委託方法負責打開視圖A和視圖B.應用程序不會在視圖A上崩潰。我從窗口中刪除視圖A,並釋放其控制器對象,並將視圖B添加到窗口。我相信這是我做錯事的地方。你能幫我解開代碼嗎?

下面是釋放視圖以及開視圖B代碼:

- (void)openViewB { 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; 

    // Remove viewControllerA from the window's view 
    [window removeFromSuperview]; 

    // !-- Commenting out this block fixes the issue --! 
    // Release memory wired for viewControllerA view 
    if(viewControllerA) { 
     [viewControllerA release]; 
     viewControllerA = nil; 
    }  

    // We call window:addSubView to add the viewB to the main window. 
    // You can use this call to add other views as child views not only to windows 
    // but to other views as well. (UIWindow is a subclass of UIView). 
    [window addSubview:viewControllerB.view]; 
    [UIView commitAnimations]; 

    // Override point for customization after application launch 
    [window makeKeyAndVisible]; 
} 

我開始用標籤欄應用程序模板的應用程序,並viewControllerBUITabBarController類型。我肯定在這裏做錯了什麼。任何指針?

+0

你爲什麼要調用`[window removeFromSuperview]`?你不應該調用`[viewControllerA.view removeFromSuperview]`? – 2009-10-08 22:01:00

回答

2

在系統庫代碼中出現崩潰並不罕見,因爲您沒有設置正確的東西。這可能是你的UIWindow或其內容視圖或你的視圖控制器實例沒有保留或以某種方式被釋放。

如果您的控制器不在周圍,那麼應該旋轉方法將無濟於事。

rpetrich的建議可能仍然有助於確定哪個對象被釋放。

對於特別棘手的問題,您可以將釋放,保留和dealloc方法(記錄和調用超級方法)添加到您的可疑類,並查看釋放它的內容。記錄-retaincount以保持跟蹤(我僅將它用於診斷目的,而不是在運輸應用程序中進行內存管理)。

1

-[UIDevice setOrientation:]上設置斷點並在調試器中遍歷代碼。

使調試容易,您可以直接在調試器控制檯類型call (void)instrumentObjcMessageSends(YES)開始記錄objc_msgSend s到/ tmp目錄/,然後continue執行,它會跟蹤所有被髮送的權利,直到崩潰的消息。

0

我也面臨同樣的問題,我認爲如果viewcontroller是使用[ViewController release]發佈的,但仍然使用視圖,到時候如果你改變方向,應用程序會崩潰。

你必須確定何時應該釋放視圖控制器[propably退出]。

相關問題