我将UIViewController子类推入导航堆栈;但是,由于它是由navigationController保留的,因此在将其推入堆栈后,我“释放”指向它的指针,以便最终弹出该视图时,该视图控制器将被取消分配。

但是,它不起作用,从不调用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方法,但从未调用过它。

我在这里想念什么?

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

**编辑:**

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

(第二次编辑:现在它再次停止工作。fffffffuuuuuuuuuuuuu)

最佳答案

在第一个示例中,如果重新分配了新的视图控制器,那将是非常奇怪的,因为您只是将其推到了导航控制器上,因此导航控制器对此具有很强的参考价值。仅当所有强引用都消失时,该对象才会被释放。

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

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

10-08 05:35
查看更多