Мой вопрос связан с тем, что я обнаружил причину сбоя 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? Или с моей стороны есть фундаментальное недоразумение относительно Цели С? Пожалуйста помоги.