限制在ios中使用autorelease池

您可以在应用程序中创建多少个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];
}
}

谢谢吉腾


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

在你发布的第一块代码中,你会因为分配一个字符串而导致内存泄漏,但是你永远不会在对象上调用release 。 在这种情况下, str不是一个自动释放对象。 autorelease池对这个对象没有影响。

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

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

启用ARC可以解决您发布的第一个和最后一个代码块的问题。 ARC会为您释放str

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

链接地址: http://www.djcxy.com/p/72763.html

上一篇: limit on using autorelease pools in ios

下一篇: release not raising error