可以通过发送-release 或-autorelease 消息来释放对象。
使用-release,引用计数会立即减少,这可能会导致释放。
使用-autorelease 时,递减会延迟以使对象在其创建范围之外保持活动状态。例如,辅助方法-createFoo 可能会返回一个自动释放的对象,以便调用者可以使用返回的对象,而无需在从方法返回时立即释放它,也不必担心谁负责释放它。
使用 ARC,编译器会为您处理所有这些细节。您需要知道的是,有时使用autorelease 可以使对象保持活动的时间更长。
这种“保持活动”行为对以下循环有影响:
- (void)foobar
{
for (/* a long time */) {
NSMutableString *s = [NSMutableString string];
// ...
}
}
NSMutableString 上的 +string 方法将返回一个自动释放的对象。这不会在循环迭代或方法结束时自动释放(嗯,ARC 可以通过查看调用堆栈进行一些巧妙的优化,但我们将忽略这一点)。这意味着当您在循环体内时,您将获得无限的内存增长。
请注意,如果我们使用了以下内容:
NSMutableString *s = [[NSMutableString alloc] init];
然后 ARC 将在循环体的末尾插入一个 release 调用,并且该字符串将立即被释放。
要解决第一个示例的无限内存增长问题,您需要定义一个显式自动释放池:
- (void)foobar
{
for (/* a long time */) {
@autoreleasepool {
NSMutableString *s = [NSMutableString string];
// ...
}
}
}
现在,在循环的每次迭代之后,自动释放池都会被销毁,并且在池内自动释放的所有对象(包括我们的字符串)都将立即释放。
所以这完全取决于您调用的方法类型以及它们是否返回自动释放的对象。