UIViewController没有在新的ARC内存管理下解除分配

时间:2011-07-30 05:07:40

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

我正在将我的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方法,但它永远不会被调用。

我在这里缺少什么?!

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

**编辑: * *

我道歉。我尝试了在自动释放池中包装的第二段代码,并将其解除分配。然后我尝试了它没有自动释放池,它也正确解除分配。我不知道昨晚发生了什么。

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

1 个答案:

答案 0 :(得分:1)

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

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

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