ios – 为什么ARC使用自动释放?

ios – 为什么ARC使用自动释放?,第1张

概述我正在运行此代码,在ARC下没有自动释放池: - (NSString*) outName { if (!outName) { outName = [[NSString alloc] initWithFormat:@"whatever"]; // or stringWithFormat } return outName;} 调试器说它每次泄漏单个outNam 我正在运行此代码,在ARC下没有自动释放池:

- (Nsstring*) outname {    if (!outname) {        outname = [[Nsstring alloc] initWithFormat:@"whatever"]; // or stringWithFormat    }    return outname;}

调试器说它每次泄漏单个outname实例而没有池.

如果我将代码更改为,则不会发生这种情况

- (Nsstring*) outname {    if (!outname) {        outname = @"whatever";    }    return outname;}

我不能做(这个例子显然是简化的).此外,如果我在调用代码中创建一个自动释放池(我想避免),泄漏消息就会消失.

为什么ARC坚持自动释放这个对象,这个对象是一个强大的属性?更重要的是,我该如何避免这种警告?

解决方法 这是一个所有权问题.

让我们先谈谈你自己分配的Nsstring.
分配对象时,堆中的内存将保留给该对象(除非您将allocWithZone:分配给另一个位置).保留计数隐式为1并且您拥有该对象,即您在完成后负责释放它.如果要返回指向该对象的指针,即返回该对象,则不会完全放弃确保该对象不泄漏的责任.您无法释放它,因为保留计数将变为0并且该对象将被释放.您自动释放它,确保在运行循环结束时(或更早),对象将被释放并可能被释放.如果返回的对象需要存活更长时间,则调用函数负责保留返回的对象.

没有自动释放池,你会泄漏,因为指定的autoReleasePool为null(记住它的罚款为空,这就是为什么这不仅仅是崩溃而不是泄漏).

具有固定@“what”的示例不会泄漏,因为编译器为该字符串保留程序内存,并且-release对它们没有影响.对于一些低值NSNumber也是如此.

正如詹姆斯所说,ARC并未删除保留版本和自动释放概念.

编辑:如何将outname声明为ivar / property?

总结

以上是内存溢出为你收集整理的ios – 为什么ARC使用自动释放?全部内容,希望文章能够帮你解决ios – 为什么ARC使用自动释放?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/999413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存