如何正确释放UITabController

3

这可能听起来像一个新手问题……但我是iOS开发的新手。

我已经通过编程方式创建了UITabController对象,就像这样:

mTabBarController = [[UITabBarController alloc] init];
...
mTabBarController.viewControllers = [NSArray arrayWithArray:tabBarItems];
[tabBarItems release];

在dealloc中这样释放mTabBarController。

- (void)dealloc {
    [mTabBarController release];
}

现在我的问题是:我会有内存泄漏吗?当我将值赋给viewController时,tabBarItems的引用计数仍为1。当我释放mTabBarController时,它是否也会释放其所有的viewcontrollers?
2个回答

1

是的,选项卡控制器拥有视图控制器数组(数组中的所有内容都会被保留)。只要您正确释放或自动释放添加到tabBarItems数组中的项目,就不会创建泄漏。

将对象关系视为所有权确实有助于理解。


我可以问一下关于这个结构的问题吗? mTabBarController.viewControllers = tabBarItems; [tabBarItems release]; 应用程序正常运行...但是我不明白如果我这样分配给viewControllers,它会得到tabBarItems的地址...然后我释放了tabBarItems...那么为什么它能正常工作呢? 可能只是因为为tabBarItems分配的内存没有被重新使用的原因...? - deimus
没错!只要确保在将每个项目添加到数组时,如果需要的话也释放该项目。 - Ash Furrow
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/4639/discussion-between-ash-furrow-and-deimus - Ash Furrow
1
好的,抱歉造成困惑。这是因为UITabBarController的viewControllers属性是一个复制属性,所以它不会保留您的数组,而是复制它。 - Ash Furrow
那么为什么释放后 tabBarItems 的 retainCount 仍然是1呢? - deimus
显示剩余2条评论

1

UITabBarController不应该作为另一个ViewController的子控制器,因此您总是需要在dealloc中释放它。如果您的TabBarController的视图是应用程序窗口的子视图,则可以不在dealloc中释放它,因为dealloc将被调用的唯一时间是在程序关闭时,此时您的控制器将被释放。但是,有些人仍然喜欢在dealloc中释放它,以保持代码的一致性。您现在的做法是正确的。


mTabBarController 不是一个视图... 我已经执行了以下操作 [self.window addSubView : mTabBarController.view] 但是在 addSubView 后立即释放 mTabBarController 导致在切换选项卡时应用程序崩溃... 我认为这是这种问题,对吗?https://dev59.com/aXNA5IYBdhLWcg3wfeAm - deimus
哇,现在还太早了...请忽略我之前说的一切...因为UITabBarController永远不应该是任何其他视图控制器的子控制器。我已经修正了这篇文章。 - aleph_null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接