问题: 我有一个 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];
}
由于某些原因,当加载 myViewController_2ndInstance 的视图后卸载 myViewController_1stInstance 的视图(但仍在导航控制器的堆栈中)时,iphone OS 可能会丢失这些“惰性私有”变量内存分配的跟踪。由于 myViewController_2ndInstance'view 仍然加载,第一次点击后面的 tapBarItem 是可以的。但是第二次点击后面的 tapBarItem 给了我地狱,因为它试图释放第一个实例。它称为 [variable release] 导致 Exc_Bad_Access 因为它随机指向(松散的指针)。
要解决这个问题很简单,在 .h 文件中将 variable1 声明为 @private。
这是我的问题: 我一直在使用“惰性私有”变量很长一段时间没有任何问题,直到它们参与 UINavigationController。这是 iPhone OS 中的错误吗?还是我对 Objective C 存在根本性的误解?