【问题标题】:Memory issue when Pushing and Popping UINavigationController in Objective C在 Objective C 中推送和弹出 UINavigationController 时的内存问题
【发布时间】:2012-05-10 04:48:32
【问题描述】:

我有两个视图控制器 VC1 和 VC2。我尝试通过创建 VC2 的对象并将其推送到按钮操作来推送 VC2。

VC2 *vcOject = [[VC2 alloc]init];
[self.navigationController pushViewController:vcOject animated:YES];
[vcObject release];

在 VC2 中,我在按钮操作中弹出它..

[self.navigationController popViewControllerAnimated:YES];

现在我在 VC1 中并再次推送 VC2 进行显示。但这次我收到 EXC_BAD_ACCESS 错误。但是当我评论 [vcObject release] 时。它工作正常。但是我什么时候可以释放内存。导航控制器中的内存是如何处理的。

【问题讨论】:

    标签: iphone objective-c xcode4 uinavigationcontroller


    【解决方案1】:

    简单回答:您应该使用 ARC

    如果出于某种原因你不能,一旦你的视图控制器从堆栈中弹出,它就会被释放,每次你想将它推入堆栈时,你应该分配/初始化一个新的。或者,如果您不想这样做 - 比如说,如果 VC2 中的视图非常重 - 摆脱您的 [vcObject release] 并在 VC1 中保留对 vcObject 的引用,并继续将同一个推入堆栈.不过,请确保不要将这两者混为一谈;如果您每次创建一个新对象时都必须在将其推入堆栈后释放它,并且如果您每次都保留将相同的 VC2 推入堆栈的引用,则在 VC1 的dealloc 之前不得释放它。请记住,您必须在 VC1 的 dealloc 方法中释放它,否则内存将被泄漏。

    但是,真的。 您应该使用 ARC。

    【讨论】:

    • 我正在使用 xcode 4.0 (ios 4)。所以我没有使用ARC。何时会调用 dealloc 方法。当我推/弹出视图控制器时,它不会被调用。那么我该如何释放它。我正在使用你的第二个建议。我保留了一个对象的引用。这样下次它只会推送同一个对象。但是 dealloc 方法没有被调用..
    • 释放视图控制器时会调用 dealloc 方法。你不负责,运行时是,所以请放心,它会在需要时被调用。实际上,这要么是控制器的视图从视图层次结构中删除,要么是应用程序终止时。只要你做对了,你就不会泄漏任何内存。没有人告诉你关于编写 Objective-C 的一件事是,你需要为你编写的每个类重写 dealloc,并释放你所有的实例变量。
    • 顺便说一句,你可以在 iOS 4.3 中使用 ARC,但它有点残缺,所以我明白你为什么不想这样做。
    【解决方案2】:

    如果您不使用[vcObject release]。它会导致内存泄漏到您的应用程序。

    所以,这是在不使用 ARC

    的情况下使用 push/pop viewController 处理内存管理的方法
    VC2 *vcOject = [[VC2 alloc] init];
    [[self.navigationController pushViewController:vcOject animated:YES] autorelease];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多