【问题标题】:UIViewController not being dealloc-ed under the new ARC memory managementUIViewController 在新的 ARC 内存管理下没有被释放
【发布时间】:2011-10-16 09:50:40
【问题描述】:

我正在将我的 UIViewController 子类推送到导航堆栈上;然而,由于它被 navigationController 保留,我在将它推入堆栈后“释放”指向它的指针,这样当它最终被弹出时,viewController 将被释放。

但是,它不起作用,viewController 的 dealloc 方法永远不会被调用。代码如下所示:

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];

[self.navigationController pushViewController:newViewController animated:YES];

newViewController = nil;

即使在以下代码中,我的 newViewController 也没有被解除分配:

MyViewController *newViewController =
    [self.storyboard instantiateViewControllerWithIdentifier:@"foo"];
newViewController = nil;

据我了解,在新的自动引用计数 (ARC) 系统下,一旦没有任何指向对象,对象就会被解除分配。我在正在创建的 viewController 的 dealloc 方法中放了一个 NSLog 方法,但它从未被调用过。

我在这里错过了什么?!

感谢您阅读我关于堆栈溢出的第一篇文章 :)

**编辑:**

我道歉。我尝试了包装在自动释放池中的第二段代码,它被释放了。然后我在没有自动释放池的情况下尝试了它,它也正确释放了。我不知道昨晚发生了什么。

(第二次编辑:现在它又停止工作了。fffffffuuuuuuuuuuuu)

【问题讨论】:

  • 由于 ARC 仍在测试中,它可能仍然存在一些错误。
  • instanceViewControllerWithIdentifier 是否返回自动释放对象?即在返回之前已发送autorelease 消息的邮件?
  • 你有一个目标是视图控制器的 NSTimer 吗?在 ARC 下,您必须使计时器无效,因为它们保留了它们的目标。
  • 我遇到了同样的问题...你知道如何释放视图控制器吗?我正在使用 Xcode5,ARC。

标签: iphone objective-c ios uiviewcontroller automatic-ref-counting


【解决方案1】:

在您的第一个示例中,如果新的视图控制器被释放,那将是非常奇怪的,因为您只是将它推送到导航控制器上,因此导航控制器对它有一个强引用。只有当所有强引用都消失时,该对象才会被释放。

在您的第二个示例中,返回的对象可能仍有来自autorelease 调用的待定释放,这些调用在instantiateInitialViewController 的实现内部执行。因此,在当前的自动释放池耗尽之前,您不会看到它消失。此外,UIStoryboard 类可能会缓存返回的对象作为优化。

简而言之,即使使用 ARC,您仍然不能假设您从框架方法接收到的对象在您使用完它们后会立即被释放,因为您不能保证在该方法的实现中没有使用自动释放。

【讨论】:

  • 是的,你是对的,当我将视图控制器压入堆栈时,它不会被释放。但是,我的问题是,一旦我将它从堆栈中弹出,它就不会被释放。导航控制器可能仍然在某处保留对它的引用,即使它被弹出(需要验证)
  • @JimTsao 导航控制器在弹出后是否保留引用?
猜你喜欢
  • 2018-08-27
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多