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

标签 iphone ios nsautoreleasepool

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

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

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 不是为了修复内存泄漏。它们的用途是帮助控制自动释放对象何时被释放的范围。无论您是否使用任何自动释放池,您都需要进行适当的内存管理。

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

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

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

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

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

关于iphone - 在 ios 中使用自动释放池的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13133242/

相关文章:

ios - 从泛型方法接收参数

ios - Swift 3 转换 NSClassFromString 需要一个 ","分隔符

ios - 为什么 __weak 变量没有在自动释放池中注册?

ios - 更改自定义 UIView 的 UILabel 文本不起作用

iphone - 是否可以有多个 iAd 实例?

iphone - 如何在iPhone上制作聊天系统?

iphone - 完成编辑后如何检查 UITextField 文本是否为空

iphone - DDXML 解析器中的内存泄漏

ios - NSThread 现在会自动创建 autoreleasepool 吗?

jquery - 从 jQuery 检测 iPhone