我的问题与我发现UINavigationController崩溃的原因有关。所以我会首先告诉你关于这个发现。请和我一起裸照。UINavigationController因推送和弹出而崩溃UIViewControllers
问题: 我有一个UINavigationController作为一个UIWindow作为子视图,一个RootViewController的类和定制类MyViewController。下面的步骤将得到一个EXC_BAD_ACCESS,100%可重复:
[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];
打左后卫tapBarItem两次(蹦出两个myViewController实例),以显示RootViewController的。
经过痛苦的半天的尝试和错误,我终于找出答案,但也提出了一个问题。
解决方案:我在.m文件中声明了许多对象作为声明私有变量的懒惰方式以避免混乱.h文件。例如,
#impoart "MyViewController.h"
NSMutableString*variable1;
@implement ...
-(id)init
{
...
varialbe1=[[NSMutableString alloc] init];
...
}
-(void)dealloc
{
[variable1 release];
}
由于种种原因,当myViewController_1stInstance的观点是加载myViewController_2ndInstance的观点后卸载(但仍然在导航控制器的堆栈)的iPhone OS可能会失去跟踪这些“懒人专用”变量内存分配。第一次点击后面的tapBarItem是可以的,因为myViewController_2ndInstance'view仍然被加载。但是第二次tapBarItem攻击给了我地狱,因为它试图释放第一例。它称[变量释放]导致了Exc_Bad_Access,因为它随机指向(松散指针)。
要解决此问题很简单,请在.h文件中将variable1声明为@private。
这里是我的问题: 我一直在使用“懒私有”变量相当长的一段时间了,没有任何问题,直到他们参与的UINavigationController。这是iPhone OS中的错误吗?或者我对Objective C有一个基本的误解?请帮忙。
这也是我一开始就猜测的。但事实并非如此。 – 2010-05-11 00:26:34
即使您确定静态变量不会导致问题,对每个实例数据使用静态变量也是一个坏主意。这就是成员变量的用途。 – 2010-05-11 00:30:23
它们不是静态的。要声明静态变量,请输入如下内容: static NSString variable1; – 2010-05-11 00:37:31