<强>问题: 我有一个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_1stInstance的视图被加载myViewController_2ndInstance的视图后卸载(但仍然在导航控制器的叠层)的iphone OS可能会失去跟踪这些“懒私有”变量的存储器分配。第一次挖掘后tapBarItem是确定的,因为myViewController_2ndInstance'view仍然加载。但在后面tapBarItem第二自来水给我的地狱,因为它试图dealloc的第一实例。它称为[可变释放]导致EXC_BAD_ACCESS因为它随机指出(松散指针)。

要解决这个问题很简单,声明变量1作为h文件一个@private。

这里是我的问题: 我已经用了很长一段时间的“懒私有”变量没有任何问题,直到他们参与的UINavigationController。这是在iPhone OS中的错误?或者有关于我对Objective C的一部分根本性的误解?

有帮助吗?

解决方案

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

在换言之,两个myViewController_1stInstancemyViewController_2ndInstance使用相同variable1位置在存储器中并覆盖彼此。

变量声明里面你@interface定义后的大括号的有(每次调用[<ClassName> alloc]时间运行的类的每个实例分配的存储空间。变量在全球范围内宣布(也就是任何功能之外或类的声明)只是:全球这意味着变量只能每次运行你的应用程序副本有一个值

有在Objective-C没有真正私有变量,但如所描述的此处

其他提示

一个位晚期反应的,但我以前见过这个问题。不要推2个viewControllers同时动画。不推动画的第一个和推动第二个动画。 UINavigationController不能同时处理两个动画。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top