2011-09-15 103 views
0

我用两个视图控制器编程创建一个标签栏,如下面的代码。当我不再需要标签栏时,我发现很难清理内存。关于发布标签栏控制器,Apple的文档非常有限。我不知道如何释放'viewControllers'数组中的所有视图控制器。我试图打印出保留计数,发现X &Ÿ的retainCount更是高达5如何释放UITabBarController及其所有视图控制器?

@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; 
} 

感谢

利奥

+0

对象的绝对retainCount毫无意义。你在浪费你的时间思考, – bbum

回答

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]; 

} 

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

UPDATE

Apple reference documents on UITabBarController状态

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

+0

我明白了。我想这就是为什么我得到奇怪的保留计数。非常感谢。我需要考虑替代UITabBar – leo

+0

由于您查看了保留计数,您会得到奇怪的保留计数!严重 - 对象的绝对保留数是没有意义的。 – bbum

相关问题