Сбой UINavigationController из-за нажатия и извлечения UIViewControllers - PullRequest
1 голос
/ 11 мая 2010

Мой вопрос связан с тем, что я обнаружил причину сбоя UINavigationController. Поэтому я расскажу вам сначала об открытии. Пожалуйста, держись со мной.

Выпуск: У меня есть UINavigationController как подпредставление UIWindow, класс rootViewController и пользовательский класс MyViewController. Следующие шаги получат Exc_Bad_Access, воспроизводимый на 100% .:100100

[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];

Дважды нажмите левый задний элемент tapBarItem (откройте два экземпляра myViewController), чтобы отобразить rootViewController.

После мучительных 1/2 дней попыток и ошибок я наконец-то выясняю ответ, но также поднимаю вопрос.

Решение: Я объявил многие объекты в файле .m как ленивый способ объявления частных переменных, чтобы избежать загромождения файла .h. Например,

#impoart "MyViewController.h"
NSMutableString*variable1;

@implement ...

-(id)init
{
   ...
   varialbe1=[[NSMutableString alloc] init];
   ...
}

-(void)dealloc
{
   [variable1 release];
}

По некоторым причинам ОС iphone может потерять отслеживание выделения памяти этими «ленивыми приватными» переменными, когда представление myViewController_1stInstance выгружено (но все еще в стеках контроллера навигации) после загрузки представления myViewController_2ndInstance. Первый раз нажать на кнопку tapBarItem нормально, так как myViewController_2ndInstance'view все еще загружен. Но 2-е нажатие на задний элемент tapBarItem дало мне ад, потому что он попытался освободить 1-й экземпляр. Это вызвало [переменная освобождение] привело к Exc_Bad_Access, потому что это указало случайно (свободный указатель).

Чтобы решить эту проблему, объявите переменную 1 как @private в файле .h.

Вот мой вопрос: Я использую «ленивые приватные» переменные довольно долго без каких-либо проблем, пока они не будут задействованы в UINavigationController. Это ошибка в iPhone OS? Или с моей стороны есть фундаментальное недоразумение относительно Цели С? Пожалуйста помоги.

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

Это может быть связано с обоими экземплярами вашего контроллера представления, использующими одну и ту же статически распределенную переменную.

Другими словами, myViewController_1stInstance и myViewController_2ndInstance используют одно и то же местоположение variable1 в памяти и перезаписывают друг друга.

Переменные, объявленные внутри фигурных скобок после определения @interface, имеют место в памяти, выделенное средой выполнения для каждого экземпляра класса (каждый раз, когда вы вызываете [<ClassName> alloc]. Переменные, объявленные в глобальной области видимости (то есть вне любых функций или объявлений классов): global. Это означает, что переменная может содержать только одно значение на рабочую копию вашего приложения.

В Objective-C нет действительно закрытых переменных, но вы можете скрыть их от других экземпляров во время компиляции, как описано здесь .

1 голос
/ 14 февраля 2012

Немного поздняя реакция, но я видел эту проблему раньше. Не нажимайте два viewControllers анимированных одновременно. Нажмите на первый без анимации и нажмите на второй с анимацией. UINavigationController не может обрабатывать две анимации одновременно.

...