0

我将我的 UIViewController 子类推到导航堆栈上;然而,由于它被导航控制器保留,我在将它推入堆栈后“释放”指向它的指针,以便当它最终弹出时,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)

4

1 回答 1

1

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

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

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

于 2011-07-30T05:44:48.040 回答