2012-10-30 33 views
0

您可以在应用程序中创建多少个autorelease?有没有限制?在ios中使用autorelease池的限制

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

而且

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

你可以使用尽可能多的你想要但你需要知道在哪里以及如何使用它 –

回答

3

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

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

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

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

启用ARC将修复您发布的第一个和最后一个代码块的问题。 ARC会照顾为你释放str

编辑:如上面的注释中所述,您可以拥有尽可能多的自动释放池,因为您需要控制自动释放对象何时被释放。