Разработка iPhone - мое приложение вылетает, когда я меняю ориентацию

StackOverflow https://stackoverflow.com/questions/475911

  •  19-08-2019
  •  | 
  •  

Вопрос

Я сталкиваюсь с этой проблемой, когда мое приложение EXC_BAD_ACCESS получает ошибку и зависает / останавливается. Я использую & Quot; Rotate Left & Quot; & Усилитель; " Повернуть вправо " варианты симулятора для имитации поведения изменения ориентации. Каковы могут быть возможные причины этой ошибки? Поскольку я не получаю подробности об ошибке, я не могу отследить ее.

Все мои классы контроллеров имеют:

- (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. Я определенно делаю что-то не так здесь. Есть указатели?

Это было полезно?

Решение

Нередко происходит сбой в коде системной библиотеки из-за того, что вы неправильно настроили. Это может быть связано с тем, что ваше UIWindow, его представление содержимого или экземпляр контроллера представления не были сохранены или каким-либо образом освобождены.

Этот метод shouldrotate не поможет, если ваш контроллер все еще не работает.

Предложения

rpetrich все еще могут быть полезны для определения, какой объект был выпущен.

Для особо острых проблем вы можете добавить методы release, retain и dealloc (которые регистрируют и вызывают super) к вашему подозрительному классу и посмотреть, что его выпускает. Записать -retaincount для отслеживания (я использую его только для диагностики, а не для управления памятью в приложении доставки).

Другие советы

Установите точку останова на -[UIDevice setOrientation:] и пролистайте свой код в отладчике.

Чтобы упростить отладку, вы можете ввести call (void)instrumentObjcMessageSends(YES) прямо в консоли отладчика, чтобы начать регистрировать objc_msgSend s в / tmp /, а затем continue выполнять, и он будет отслеживать все сообщения, отправленные вплоть до авария.

Я тоже столкнулся с той же проблемой, я думаю, если viewcontroller выпущен с использованием [ViewController release], но все еще использует представление, и к тому времени, если вы измените ориентацию, приложение вылетит.

Вы должны точно выяснить, когда вы должны освободить контроллер вида [вероятно, при выходе].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top