【问题标题】:Is it ok to autorelease UIViewControllers?可以自动释放 UIViewControllers 吗?
【发布时间】:2010-08-20 00:07:53
【问题描述】:

我有一些视图控制器:

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

可以自动释放它们还是手动释放更好?为什么?

【问题讨论】:

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


    【解决方案1】:

    您在代码中所做的一切都很好。为了使事情更加一致,我还将创建 stdNavControllerscheduleNavController 作为自动释放的对象。

    【讨论】:

      【解决方案2】:

      阅读mikeash.com: Autorelease is Fast

      他没有测试的是自动发布与发布。当我测试时,一百万个[[[NSObject alloc] init] autorelease] 加上自动释放池开销是[[[NSObject alloc] init] release] 的两倍。诚然,我在 10.6 上进行了测试(大概是因为我没有启用 GC,所以它仍然被重新计算),但相对性能仍然保持不变。

      也许 autorelease 使用几微秒的 CPU 时间,但它肯定比添加内存泄漏要好,因为您将 ivar 更改为本地,或者您复制粘贴代码并忘记了发布。

      在重要的时候关心性能。当它这样做时,您可能会决定使用 CFString 而不是 NSString 和 ivar 访问而不是属性访问和函数调用而不是类方法。但总的来说,编写易于维护的代码很重要,即使这意味着要多使用 1% 的 CPU。

      【讨论】:

        【解决方案3】:

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

        release 通知操作系统对象 id 不再需要并且可以释放分配的内存。

        为了在 iOS 上获得性能,最好使用 release,而不是 autorelease,因为系统可以立即收回分配的内存。

        【讨论】:

        • 在这种情况下这不是一个真正有效的参数,因为在这种情况下根本不会收回内存,因为所有创建的对象都将立即由其他对象拥有。
        • 因为我说的是“系统可以认领”,所以我没有说系统会。一旦对象的保留计数达到零,系统就会收回内存。即使在保留计数 == 0 的情况下使用自动释放,系统也不会在当前运行循环结束之前收回内存。如果在代码块结束之前关闭视图控制器会怎样?
        猜你喜欢
        • 1970-01-01
        • 2012-07-19
        • 2011-02-15
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        相关资源
        最近更新 更多