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];
}
我开始用标签栏应用程序模板的应用程序,并viewControllerB
是UITabBarController
类型。我肯定在这里做错了什么。任何指针?
在系统库代码中出现崩溃并不罕见,因为您没有设置正确的东西。这可能是你的UIWindow或其内容视图或你的视图控制器实例没有保留或以某种方式被释放。
如果您的控制器不在周围,那么应该旋转方法将无济于事。
rpetrich的建议可能仍然有助于确定哪个对象被释放。
对于特别棘手的问题,您可以将释放,保留和dealloc方法(记录和调用超级方法)添加到您的可疑类,并查看释放它的内容。记录-retaincount以保持跟踪(我仅将它用于诊断目的,而不是在运输应用程序中进行内存管理)。
在-[UIDevice setOrientation:]
上设置断点并在调试器中遍历代码。
使调试容易,您可以直接在调试器控制台类型call (void)instrumentObjcMessageSends(YES)
开始记录objc_msgSend
s到/ tmp目录/,然后continue
执行,它会跟踪所有被发送的权利,直到崩溃的消息。
我也面临同样的问题,我认为如果viewcontroller是使用[ViewController release]发布的,但仍然使用视图,到时候如果你改变方向,应用程序会崩溃。
你必须确定何时应该释放视图控制器[propably退出]。
你为什么要调用`[window removeFromSuperview]`?你不应该调用`[viewControllerA.view removeFromSuperview]`? – 2009-10-08 22:01:00