【问题标题】:Is it better to autorelease or release right after?自动发布还是之后立即发布更好?
【发布时间】:2010-11-19 23:29:20
【问题描述】:

在很多情况下,一个实例会分配一个实例,并在它被分配给其他东西后立即释放它,它会在内部保留它。

例如,

UIView *view = [[UIView alloc] initWithFrame...]; [自我添加子视图:视图]; [查看发布];

我听说有人建议我们使用自动释放而不是立即释放。

所以上面变成了:

UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; [自我添加子视图:视图];

这里的最佳做法是什么?利弊?

【问题讨论】:

    标签: iphone memory-management uikit


    【解决方案1】:

    在大多数情况下,这两种方式都无关紧要。由于-autorelease 仅仅意味着对象将在当前运行循环的迭代结束时被释放,所以无论哪种方式,对象都会被释放。

    使用-autorelease 的最大好处是您不必担心方法上下文中对象的生命周期。因此,如果您稍后决定要在对象最后一次使用几行后对其执行某些操作,则无需担心将呼叫转移到 -release

    使用-release 与使用-autorelease 相比,主要实例是如果您在方法中创建很多 临时对象。例如,考虑以下方法:

    - (void)someMethod {
        NSUInteger i = 0;
        while (i < 100000) {
            id tempObject = [[[SomeClass alloc] init] autorelease];
    
            // Do something with tempObject
    
           i++;
        }
    }
    

    到此方法结束时,您已经有 100,000 个对象位于自动释放池中等待释放。根据tempObject 的类别,这可能是也可能不是桌面上的主要问题,但它肯定会出现在内存受限的iPhone 上。因此,如果您要分配许多临时对象,您应该真正使用-release 而不是-autorelease。但是,对于许多/大多数用途,您不会看到两者之间有任何重大差异。

    【讨论】:

    • +1。 autorelease 在性能方面有很多缺点(我很少看到在正常的非大型循环代码中用数字支持),但是当代码被重构时,autorelease 也可以节省很多泄漏。我确实在低级例程中更频繁地使用 release,因为我不知道它们是否可能在更高级别的大循环中被调用。但是,如果要使用 release,如果变量仍在范围内,则必须立即将变量设置为 nil。永远不要释放一个对象,但仍然有一个指向它的指针。
    【解决方案2】:

    我同意Matt Ball。让我补充一点,如果您发现自己经常使用这种模式,那么编写一个快速类别会很方便:

    @interface UIView (MyCategories)
    - (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame;
    @end
    
    @implementation UIView (MyCategories)
    - (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame
    {
        UIView * newView = [[viewType alloc] initWithFrame:frame];
        [self addSubView:newView];
        return [newView autorelease];
    }
    @end
    

    可以如下使用:

    UIView * view = [someView addNewSubviewOfType:[UIView class]
                                          inFrame:someFrame];
    

    它甚至可以与其他类型一起使用,只要它们是从 UIView 派生的:

    UIButton * button = [mainView addNewSubviewOfType:[UIButton class]
                                              inFrame:buttonFrame];
    

    【讨论】:

      【解决方案3】:

      我通常尽可能选择 -release 而不是 -autorelease。这来自多年调试和增强其他人的 Objective-C 代码的经验。当一个对象被过度释放时,到处使用自动释放的代码使得调试变得更加困难,因为额外的释放发生在远离错误代码的地方。

      许多人在不了解可可内存管理的工作原理时也会使用自动释放。学习规则,学习 API,你几乎不需要自动释放对象。

      最后一点是,如果您不需要自动释放行为,那么使用自动释放只会不必要地为您的程序添加额外的工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        相关资源
        最近更新 更多