在很多情况下,人们会分配一个实例,然后在将其分配给其他对象后立即释放它,从而将其保留在内部。
例如,
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
。但是,对于很多/大多数用途,您不会看到两者之间的任何主要差异。