我正在将我的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)
答案 0 :(得分:1)
在你的第一个例子中,如果新的视图控制器被解除分配将是非常奇怪的,因为你只是将它推到导航控制器上,因此导航控制器有一个强引用它。只有当所有强引用都消失时,才会释放该对象。
在第二个示例中,返回的对象可能仍然具有autorelease
调用的暂挂版本,这些调用是在instantiateInitialViewController
的实现内部执行的。因此,在当前自动释放池耗尽之前,您不会看到它消失。此外,UIStoryboard
类可能会将返回的对象缓存为优化。
简而言之,即使使用ARC,您仍然不能假设从框架方法中获得的对象在完成后会立即释放,因为您不能保证在该方法的实现中不使用自动释放。