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

时间:2009-01-24 11:47:27

标签: iphone orientation

我遇到了这个问题,我的应用程序出现EXC_BAD_ACCESS错误并且卡住/停止。我正在使用“向左旋转”和模拟器的“向右旋转”选项可模拟方向变化行为。这个错误的可能原因是什么?由于我没有得到有关错误的详细信息,我无法追踪它。

我所有的控制器类都有:

- (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

请注意,当我的视图包含标签栏时会出现错误。由于没有人回复,我想这不是一个常见的问题,我找不到任何解决这个问题的资源。

  

我可以以某种方式告诉我的应用程序以单向(纵向)运行,并且不发送方向更改事件。这可能会解决我的问题,但这是我正在寻找的替代方案。


感谢Paul,您的评论很有帮助,我能够解决问题,但是我不需要为视图保留内存的成本。这是最新发生的事情:

我有一个视图(视图A),它打开另一个视图(视图B)。 App Delegate方法负责打开View A和View B.应用程序不会在View A上崩溃。我从窗口中删除View A,然后释放它的控制器对象,并将View B添加到窗口。我相信这是我做错事的地方。你能帮我解决一下代码吗?

以下是发布View A并打开View 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];
}

我使用标签栏应用程序模板启动了应用程序,viewControllerB的类型为UITabBarController。我肯定在这里做错了。有什么指针吗?

3 个答案:

答案 0 :(得分:2)

由于您没有正确设置,因此系统库代码崩溃的情况并不少见。这可能是您的UIWindow或其内容视图或视图控制器实例未被保留或以某种方式被释放。

如果你的控制器还不在,那么shouldrotate方法将无济于事。

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

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

答案 1 :(得分:1)

-[UIDevice setOrientation:]上设置断点,然后在调试器中逐步执行代码。

为了使调试更容易,您可以在调试器控制台中键入call (void)instrumentObjcMessageSends(YES)以开始将objc_msgSend记录到/ tmp /,然后执行continue,它将跟踪所有消息直到事故发生。

答案 2 :(得分:0)

我也遇到了同样的问题,我认为如果使用[ViewController发布]发布了viewcontroller但仍然使用了视图,那么如果更改了方向,应用程序崩溃了。

你必须弄清楚你应该何时释放viewcontroller [可能在退出时]。