在很多情况下,人们会分配一个实例,然后在将其分配给其他对象后立即释放它,从而将其保留在内部。

例如,

UIView * view = [[UIView alloc] initWithFrame ...];
[self addSubView:view];
[查看发布];


我听说有人建议我们使用自动发布,而不是紧接着发布。

因此,以上内容变为:

UIView * view = [[[[UIView alloc] initWithFrame ...] autorelease];
[self addSubView:view];


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

最佳答案

在大多数情况下,这两种方法都不重要。由于-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。但是,对于很多/大多数用途,您不会看到两者之间的任何主要差异。

07-27 14:04