限制在ios中使用自动释放池

时间:2012-10-30 05:36:47

标签: iphone ios nsautoreleasepool

您可以在应用程序中创建多少个自动释放?有没有限制?

我在谷歌搜索了一个答案,但没有得到任何有用的信息。

int main(){

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init];

NSString *str = [NSString alloc]init];

[pool drain];
}

在谷歌,我几乎在所有文章中都找到了这个样本。 使用上面的代码,如果我们在Xcode中进行分析,它会抛出内存泄漏。相反,如果我们以这种方式分配str NSString * str = [NSString alloc] init] autorelease;

然后它不会抛出任何内存泄漏。

哪种方式是正确的。

同样在上面的代码中,我发现当执行[pool drain]语句时,释放变量str。当我们使用“@autorelease”关键字而不是NSAutoreleasePool编写相同的代码时,会发生什么。我的意思是如果我们使用@autorelease,就不会有像[pool drain]这样的语句。

我的意思是这样

int main(){

@autorelease{
NSString *str = [NSString alloc]init];
}
}

由于 Jithen

1 个答案:

答案 0 :(得分:3)

使用NSAutoreleasePool@autorelease不是为了修复内存泄漏。它们的用途是帮助控制释放自动释放对象的范围。无论是否使用任何自动释放池,都需要进行适当的内存管理。

在您发布的第一个代码块中,您会收到内存泄漏,因为您分配了一个字符串,但您从未在该对象上调用release。在这种情况下,str不是自动释放的对象。自动释放池对此对象没有影响。

当您在字符串上添加对autorelease的调用时,对象将在某个时间点排队等待自动释放。耗尽自动释放池会触发该释放。

使用@autorlease的最后一个代码与第一个代码块相同。您没有正确释放str因此会泄漏。但同样,这与自动释放池无关。

启用ARC会解决您发布的第一个和最后一个代码块的问题。 ARC将负责为您发布str

编辑:如上面的评论中所述,您可以拥有尽可能多的自动释放池来控制何时实际释放自动释放的对象。