是否可以自动释放UIViewControllers?

时间:2010-08-20 00:07:54

标签: iphone objective-c cocoa-touch memory uiview

我有一些视图控制器:

StockTwitsTVViewController* stvViewController = [[[StockTwitsTVViewController alloc] initWithNibName:@"StockTwitsTVViewController" bundle:nil]autorelease];
    UINavigationController *stvNavController = [[UINavigationController alloc] initWithRootViewController:stvViewController];
    stvNavController.tabBarItem.image = [UIImage imageNamed:@"today-icon.png"];

    ScheduleViewController* scheduleViewController = [[[ScheduleViewController alloc] initWithNibName:@"ScheduleViewController" bundle:nil]autorelease];
    scheduleViewController.title = @"Archives";
    UINavigationController *scheduleNavController = [[UINavigationController alloc] initWithRootViewController:scheduleViewController];
    scheduleNavController.tabBarItem.image = [UIImage imageNamed:@"archived-icon.png"];

    stvTabBarController = [[UITabBarController alloc] init];
    stvTabBarController.delegate = self;
    stvTabBarController.viewControllers = [NSArray arrayWithObjects:stvNavController, scheduleNavController, nil];
    stvTabBarController.selectedViewController = stvNavController;

    [stvNavController release];
    [scheduleNavController release];

    [self presentModalViewController:stvTabBarController animated:YES];

是否可以自动释放它们,还是手动释放更好的做法?为什么呢?

3 个答案:

答案 0 :(得分:1)

您在代码中执行的操作非常精细。为了使事情更加一致,我还会将stdNavControllerscheduleNavController创建为自动释放的对象。

答案 1 :(得分:1)

阅读mikeash.com: Autorelease is Fast

他没有测试的是自动释放与释放。当我测试时,一百万[[[NSObject alloc] init] autorelease]加上自动释放池开销大约是[[[NSObject alloc] init] release]的两倍。不可否认,我在10.6上进行了测试(大概是因为我没有启用GC而仍然重新计算),但相对性能仍然存在。

也许autorelease使用几微秒的CPU时间,但是肯定会因为你将ivar改为本地或者你复制粘贴的代码并忘记发布而增加了内存泄漏。

关注绩效。如果是这样,您可能决定使用CFString而不是NSString和ivar访问而不是属性访问和函数调用而不是类方法。但是,一般来说,编写易于维护的代码非常重要,即使这意味着使用1%的CPU。

答案 2 :(得分:-1)

autorelease 将让操作系统稍后完成发布,这意味着当前的运行循环结束。

发布告知操作系统不再需要对象ID,并且可以释放已分配的内存。

对于iOS上的性能,最好使用发布,而不是 autorelease ,因为系统可以直接声明已分配的内存。