【问题标题】:How to release UITabBarController with all its view controllers?如何释放 UITabBarController 及其所有视图控制器?
【发布时间】:2011-09-15 08:52:43
【问题描述】:

我以编程方式创建一个带有两个视图控制器的标签栏,如下面的代码。当我不再需要标签栏时,我发现很难清理内存。 Apple 的文档对于发布标签栏控制器非常有限。我不知道如何释放“viewControllers”数组中的所有视图控制器。我尝试打印出retain count,发现x & y的retainCount高达5。

@interface X:UIViewController
@interface Y:UIViewController

@interface Z: UIViewController {
  UITabBarController *tabBar; 
}
@end

@implementation Z
-(IBAction)openTabBarUp{
  UITabBarController *tabBar = [[UITabBarController alloc] init];

  X *x = [[X alloc] init];
  Y *y = [[Y alloc] init];

  tabBar.viewControllers = [NSArray arrayWithObjects: x, y, nil];
  [self.view addSubView: tabBar.view];

}

这就是我尝试释放内存的方式:

-(IBAction)removeTabBar{
  [tabBar.view removeFromSuperView];
  [tabBar release];
  tabBar = nil;
}

谢谢

狮子座

【问题讨论】:

  • 一个对象的绝对retainCount是没有意义的。你在浪费时间去想它,

标签: iphone objective-c cocoa-touch uitabbarcontroller


【解决方案1】:
-(IBAction)openTabBarUp{
  tabBar = [[UITabBarController alloc] init];

  X *x = [[X alloc] init];
  Y *y = [[Y alloc] init];

  tabBar.viewControllers = [NSArray arrayWithObjects: x, y, nil];
  [self.view addSubView: tabBar.view];

}

您在openTabBarUp 方法中确实需要UITabBarController *tabBar = [[UITabBarController alloc] init];,因为您已经在头文件中声明了它的一个实例。您可以使用 [tabBar release]; 释放 tabBar,但 Apple 坚持将 tabBarController 添加为主窗口的根视图,而不是任何视图控制器的一部分。

更新

Apple reference documents on UITabBarController 状态

部署标签栏界面时,必须将此视图安装为 你的窗口的根。与其他视图控制器不同,标签栏 界面永远不应该作为另一个视图的子项安装 控制器。

【讨论】:

  • 我明白了。我认为这就是为什么我得到奇怪的保留计数。非常感谢。我需要考虑替代 UITabBar
  • 您会得到奇怪的保留计数,因为您查看了保留计数!说真的——对象的绝对保留计数是没有意义的。
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多