【问题标题】:How correctly release UITabController如何正确释放 UITabController
【发布时间】:2011-11-01 12:33:58
【问题描述】:

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

我已经像这样以编程方式创建了UITabController 对象。

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

然后像这样在 dealloc 中释放 mTab​​BarController。

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

现在我的问题是:我会出现内存泄漏吗?当我分配值 t viewController 时,tabBarItems 的引用计数仍然是 1。当我释放 mTab​​BarController 时,它是否也释放了它所有的 viewcontrollers ?

【问题讨论】:

    标签: objective-c ios memory-management memory-leaks


    【解决方案1】:

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

    将对象关系视为所有权确实很有帮助。

    【讨论】:

    • 我也可以问一下这个结构 mTab​​BarController.viewControllers = tabBarItems; [tabBarItems 发布];应用程序工作正常......但是如果我将这种方式分配给 viewControllers 它将获得 tabBarItems 的地址......然后我释放 tabBarItems......那么为什么它工作正常?可能只是一个事件,分配给 tabBarItems 的内存没有被重用...?
    • 没错!只需确保在将每个项目添加到数组时,如果需要,该项目也会被释放。
    • 当你分配 viewControllers = tabBarItems 时,标签视图控制器会保留数组。释放数组时不会清除该数组,因为它已被选项卡栏控制器保留。所以,标签栏控制器拥有数组,而数组拥有其中的每一项,所以你是安全的。
    • 好的,很抱歉造成混乱。这是因为 UITabBarController 的 viewControllers 属性是一个复制属性,所以它不会保留你的数组,它会复制它。
    【解决方案2】:

    UITabBarController 不应该被放置为另一个 ViewController 的子级,所以你总是必须在 dealloc 中释放它。如果您的 TabBarController 的视图是应用程序窗口的子视图,则可以不在 dealloc 中释放它,因为唯一会调用 dealloc 的时间是在您的程序关闭时,在这种情况下,无论如何您的控制器都会被释放。然而,有些人喜欢在 dealloc 中发布它,只是为了保持他们的代码一致。你做的很好。

    【讨论】:

    • mTabBarConroller 不是视图......我已经完成了 [self.window addSubView : mTab​​BarController.view] 但在 addSubView 之后释放 mTab​​BarController 导致应用程序在选项卡之间切换时崩溃......我认为是这种问题,对吗? stackoverflow.com/questions/937767/…
    • 哇,早上太早了......忽略我之前所说的一切......它总是错的,因为 UITabBarController 不应该是任何其他视图控制器的孩子。不过我修复了这个帖子。
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 2020-06-23
    • 2020-08-24
    • 1970-01-01
    • 2018-03-14
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多