【问题标题】:limit on using autorelease pools in ios在 ios 中使用自动释放池的限制
【发布时间】:2012-10-19 10:52:22
【问题描述】:

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

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

int main(){

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init];

NSString *str = [NSString alloc]init];

[pool drain];
}

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

那么它不会引发任何内存泄漏。

哪种方式是正确的。

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

我的意思是这样

int main(){

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

谢谢 吉腾

【问题讨论】:

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

标签: iphone ios nsautoreleasepool


【解决方案1】:

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

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

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

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

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

编辑:正如上面评论中所述,您可以拥有任意数量的自动释放池,以控制何时实际释放自动释放的对象。

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    相关资源
    最近更新 更多