代码之家  ›  专栏  ›  技术社区  ›  bpapa

如何使用导航控制器管理uiviewcontrollers?

  •  6
  • bpapa  · 技术社区  · 16 年前

    是的,我是这个疯狂的iPhone世界里的爪哇人。说到记忆管理,我还是不太清楚自己在做什么。

    我有一个应用程序使用导航控制器,当需要进入下一个视图时,我有如下代码:

    UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView" 
                                                                        bundle:[NSBundle mainBundle];
    [[self navigationController] pushViewController:myController animated:YES];
    

    现在,根据苹果关于内存管理的基本规则

    如果使用名称以__alloc_157;或__new_157;开头或包含__copy_157;(例如, alloc , newObject mutableCopy 或者如果你发送一个 retain 消息。您有责任放弃自己使用的对象的所有权 release autorelease . 其他任何时候你收到一个物体,你都不能释放它。

    对我来说这意味着我应该释放 myController 或者给它一个 自动复位 消息。但是,每当我尝试这样做时,当我将视图从堆栈中推出来并弹出时,应用程序都会崩溃。

    我闻起来不对劲,但在运行仪器时,它声称我没有任何内存泄漏。

    所以我的问题是

    1. 我做得对吗?
    2. 导航控制器是否取得了MyViewController的所有权,从而解释了内存泄漏的不足?
    3. 我应该将mycontroller分配给根视图控制器中的实例变量吗?在这种情况下,它将被标记为retain,而我将在根的dealoc方法中释放它。
    2 回复  |  直到 16 年前
        1
  •  3
  •   community wiki dnolen    16 年前

    @Ben Gottlieb为什么在推之前需要自动释放?对象分配时的保留计数为1,推送前后的自动释放不会影响保留计数,尽管通常在对象分配/init之后应用样式方面的自动释放:

    [[[object alloc] init] autorelease];
    

    BPPAA,

    2)按下时,导航控制器将保留视图控制器。稍后,当这个视图从导航控制器堆栈中弹出时,导航控制器将释放它。

    3)除非有明确的理由保留该视图,否则不应将其分配给实例变量。一般来说,您只希望视图在需要时存在。

        2
  •  9
  •   Ben Gottlieb    16 年前

    问题是(很可能)您正在释放视图控制器 之前 导航控制器有机会申请所有权。有两种方法可以解决这个问题:

    • -release 你的控制器 之后 把它推到导航控制器上
    • -autorelease 你的控制器 之前 推动它。如果您这样做,激活的NSAutoReleasePool(您不必担心)将在以后处理释放控制器的问题。