Проблема: у меня есть UINavigationController как подвид UIWindow, класс rootViewController и пользовательский класс MyViewController. Следующие шаги получат Exc_Bad_Access, воспроизводимый на 100%.:
[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 все еще загружено. Но второе нажатие на задний tapBarItem устроило мне ад, потому что оно пыталось освободить 1-й экземпляр. Это вызвало [выпуск переменной], что привело к Exc_Bad_Access, потому что он указывал случайным образом (свободный указатель).
Чтобы решить эту проблему, просто объявите переменную1 как @private в файле .h.
Вот мой вопрос: я использовал "ленивые частные" переменные в течение достаточно долгого времени без каких-либо проблем, пока они не были задействованы в UINavigationController. Это ошибка в iPhone OS? Или с моей стороны есть фундаментальное непонимание цели C?