1

问题: 我有一个 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 存在根本性的误解?

4

2 回答 2

3

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

换句话说,两者都使用内存中的相同位置myViewController_1stInstance并相互覆盖。myViewController_2ndInstancevariable1

在定义之后在花括号内声明的变量@interface具有由运行时为类的每个实例分配的内存位置(每次调用[<ClassName> alloc]. 在全局范围内声明的变量(即在任何函数或类声明之外)只是那:全局。这意味着该变量在每个运行的应用程序副本中只能保存一个值。

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

于 2010-05-11T00:22:13.763 回答
1

反应有点晚,但我以前见过这个问题。不要同时推送两个viewControllers动画。推第一个不带动画,推第二个带动画。UINavigationController不能同时处理两个动画。

于 2012-02-14T06:38:38.320 回答