代码之家  ›  专栏  ›  技术社区  ›  Wayne Lo

uinavigationcontroller由于推送和弹出uiviewcontrollers而崩溃

  •  1
  • Wayne Lo  · 技术社区  · 14 年前

    我的问题与我发现uinavigationcontroller崩溃的原因有关。所以我先告诉你这个发现。请和我一起裸着。

    问题: 我有一个uinavigationController作为uiwindow的子视图,一个rootviewController类和一个自定义的myviewController类。以下步骤将获得一个exc_bad_访问,100%可复制:

    [myNaviationController pushViewController:myViewController_1stInstance animated:YES];
    [myNaviationController pushViewController:myViewController_2ndInstance animated:YES];
    

    点击左后tapbaritem两次(弹出两个myviewcontroller实例)以显示rootviewcontroller。

    经过痛苦的1/2天的尝试和错误,我终于找到了答案,但也提出了一个问题。

    Solutio: 我在.m文件中声明了许多对象,这是一种懒惰的声明私有变量的方法,以避免混淆.h文件。例如,

    #impoart "MyViewController.h"
    NSMutableString*variable1;
    
    @implement ...
    
    -(id)init
    {
       ...
       varialbe1=[[NSMutableString alloc] init];
       ...
    }
    
    -(void)dealloc
    {
       [variable1 release];
    }
    

    出于某些原因,当加载myviewcontroller的视图后卸载myviewcontroller的视图(但仍在导航控制器的堆栈中)时,iPhone操作系统可能会失去对这些“懒惰的私有”变量内存分配的跟踪。第一次点击后TapBarItem是正常的,因为MyViewController ndInstance'视图仍处于加载状态。但是第二次轻敲后面的tapbaritem给了我地狱,因为它试图释放第一个实例。它称为[变量释放]导致exc_错误访问,因为它随机指向(松散指针)。

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

    我的问题是: 在uinavigationcontroller中使用“lazy private”变量之前,我已经使用了相当长的一段时间,没有任何问题。这是iPhone操作系统中的错误吗?或者我对目标C有一个基本的误解?请帮忙。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Frank Schmitt    14 年前

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

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

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

    在objective-c中没有真正的私有变量,但是您可以在编译时将它们隐藏起来,如前所述。 here .

        2
  •  1
  •   dif    12 年前

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