1

我的问题与我发现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有一个基本的误解?请帮忙。

回答

3

它可能与您的视图控制器的两个实例使用相同的静态分配变量有关。

换句话说,myViewController_1stInstancemyViewController_2ndInstance在内存中使用相同的variable1位置并相互覆盖。

声明的花括号内的@interface定义后的变量是由运行时为每次调用[<ClassName> alloc]时间类的每个实例(分配的存储空间。在全球范围内声明的变量(即,任何功能外或类别声明)就是:global。这意味着变量只能为每个应用程序的运行副本保留一个值

Objective-C中没有真正的私有变量,但可以将它们隐藏在其他实例中在编译时所描述的here

+0

这也是我一开始就猜测的。但事实并非如此。 – 2010-05-11 00:26:34

+0

即使您确定静态变量不会导致问题,对每个实例数据使用静态变量也是一个坏主意。这就是成员变量的用途。 – 2010-05-11 00:30:23

+0

它们不是静态的。要声明静态变量,请输入如下内容: static NSString variable1; – 2010-05-11 00:37:31

1

有点晚了反应,但我之前看过这个问题。不要同时推动两个viewControllers动画。推动第一个没有动画,并推动第二个与动画。 UINavigationController无法同时处理两个动画。

+0

或弹出第一个没有动画,并推动第二个与动画。 – ChildhoodAndy 2015-10-15 11:24:15

相关问题