2

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

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

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


谢谢保罗,您的评论很有帮助,我能够解决问题,但需要为我不需要的视图保留内存。这是发生了什么:

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

下面是释放视图 A 和打开视图 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. 我肯定在这里做错了什么。任何指针?

4

3 回答 3

2

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

如果您的控制器不在身边,则 shouldrotate 方法将无济于事。

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

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

于 2009-01-26T19:02:55.290 回答
1

在调试器中设置断点-[UIDevice setOrientation:]并单步执行您的代码。

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

于 2009-01-25T00:14:34.110 回答
0

我也遇到了同样的问题,我认为如果使用 [ViewController release] 释放视图控制器但仍在使用视图,那么到那时如果您更改方向应用程序崩溃。

您必须弄清楚何时应该释放视图控制器[最好在退出时]。

于 2009-06-01T07:01:53.057 回答