【问题标题】:UINavigationController crash because of pushing and poping UIViewControllersUINavigationController 由于推送和弹出 UIViewController 而崩溃
【发布时间】:2011-02-17 22:27:23
【问题描述】:

问题: 我有一个 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 操作系统可能会丢失这些“惰性私有”变量内存分配的跟踪。由于 myViewController_2ndInstance'view 仍然加载,第一次点击返回 tapBarItem 是可以的。但是第二次点击后面的 tapBarItem 给了我地狱,因为它试图释放第一个实例。它称为 [variable release] 导致 Exc_Bad_Access 因为它随机指向(松散指针)。

要解决这个问题很简单,在 .h 文件中将 variable1 声明为 @private。

这是我的问题: 我一直在使用“惰性私有”变量很长一段时间没有任何问题,直到它们参与 UINavigationController。这是 iPhone OS 中的错误吗?还是我对 Objective C 存在根本性的误解?

【问题讨论】:

    标签: crash uinavigationcontroller exc-bad-access private-members pushviewcontroller


    【解决方案1】:

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

    【讨论】:

    • 或者弹出第一个不带动画的,推第二个带动画的。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这也是我一开始的猜测。但事实并非如此。
    • 即使您确定静态变量不会导致问题,对每个实例的数据使用静态变量也是一个坏主意。这就是成员变量的用途。
    • 它们不是静态的。声明静态变量,输入如下:static NSString variable1;
    • 在函数/方法或类定义之外声明的任何变量都是隐式静态的。
    • 谢谢弗兰克。这很有趣,也很好地解释了我的经历。我不确定为什么 Objective 采用这种隐式风格。你能指点我这方面的任何在线参考吗?如何声明非静态?
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多