我有一些视图控制器:
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];
是否可以自动释放它们,还是手动释放更好的做法?为什么呢?
答案 0 :(得分:1)
您在代码中执行的操作非常精细。为了使事情更加一致,我还会将stdNavController
和scheduleNavController
创建为自动释放的对象。
答案 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 ,因为系统可以直接声明已分配的内存。