iPhone开发 - 当我改变方向时,我的应用程序崩溃

问题描述:

我碰到这个问题,我的应用程序得到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

在系统库代码中出现崩溃并不罕见,因为您没有设置正确的东西。这可能是你的UIWindow或其内容视图或你的视图控制器实例没有保留或以某种方式被释放。

如果您的控制器不在周围,那么应该旋转方法将无济于事。

rpetrich的建议可能仍然有助于确定哪个对象被释放。

对于特别棘手的问题,您可以将释放,保留和dealloc方法(记录和调用超级方法)添加到您的可疑类,并查看释放它的内容。记录-retaincount以保持跟踪(我仅将它用于诊断目的,而不是在运输应用程序中进行内存管理)。

-[UIDevice setOrientation:]上设置断点并在调试器中遍历代码。

使调试容易,您可以直接在调试器控制台类型call (void)instrumentObjcMessageSends(YES)开始记录objc_msgSend s到/ tmp目录/,然后continue执行,它会跟踪所有被发送的权利,直到崩溃的消息。

我也面临同样的问题,我认为如果viewcontroller是使用[ViewController release]发布的,但仍然使用视图,到时候如果你改变方向,应用程序会崩溃。

你必须确定何时应该释放视图控制器[propably退出]。