Я сталкиваюсь с этой проблемой, когда мое приложение получает ошибку 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). Метод делегата приложения отвечает за открытие как представления 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
. Я определенно делаю что-то не так здесь. Есть указатели?