自动引用计数混淆

Posted

技术标签:

【中文标题】自动引用计数混淆【英文标题】:Automatic reference counting confusions 【发布时间】:2012-01-07 03:22:30 【问题描述】:

我一直在阅读有关自动引用计数的不同来源,但没有找到任何可以阐明我理解的优秀文章或文档。我对 ARC(Automatic Reference Counting) 的理解是,它完全接管了开发人员对内存管理的控制权,并将其分配给编译器进行内存管理。

我想对了吗?

这是否意味着 ios 5 SDK 不再需要保留、释放和自动释放?


示例:

假设我用来制作这样的对象,

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
 message.tag = 0;
 [message addSubview:balloonView];
 [message addSubview:label];
 [cell.contentView addSubview:message];

 [balloonView release];
 [label release];
 [message release];

会变成这样如果 ARC 开启

UIView *message = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, cell.frame.size.width, cell.frame.size.height)];
 message.tag = 0;
 [message addSubview:balloonView];
 [message addSubview:label];
 [cell.contentView addSubview:message];

任何意见都会有所帮助,谢谢

干杯!

【问题讨论】:

【参考方案1】:

是与否:

是的,ARC 让您摆脱了手动调用 retainreleaseautorelease 的麻烦,可能让您删除很多 dealloc 实现,并且 - 在新的运行时 - 甚至引入了归零弱引用 (w00t !),但它本身并不能防止您泄露

它是自动保留/释放,而不是垃圾收集器,因此它“允许”仍然通过创建保留周期来泄漏内存。

此外,它将__block 属性的引用语义从weak 更改为strong: 您使用 __block id blockSelf = self; 避免捕获 self 的每一段代码现在都可能存在泄漏 — 幸运的是,Clang 已经更好地警告您此类问题。

在大多数情况下,ARC 实际上使您编写的代码比以前更多 的领域是当您在CFTypeRefs 和id <NSObject>s 之间使用免费桥接时: 必须对强制转换进行注释以告诉 ARC 要做什么,否则会出现编译器错误。

如果您使用的是普通的 CF API,则没有任何变化:一切都保持手动。

我找到的关于 ARC 的最佳资源之一是 Chris Parker 关于 ARC Internals 的 WWDC 演讲。如果你还没有看过,你绝对应该check it out——ARC 的一般部分从 8 分钟左右开始,而细节部分从大约 29 分钟开始。

【讨论】:

【参考方案2】:

您的示例代码是正确的。 ARC 会为您拨打这些电话。

然而,ARC 并没有“完全接管”新手仍然需要了解内存管理。但是就像苹果说的那样,它可以让你专注于对象所有权而不是保留计数。

例如,如果您不使用__weak__unsafe_unretained 修改您的NSObject <Protocol> *_delegate;,您仍将创建一个保留周期。

【讨论】:

【参考方案3】:

是的,你是对的。 ARC 几乎免除了您进行内存管理的麻烦,并让编译器处理所有这些事情。坐下来,放松一下,更多地担心编写您想要的代码,而不是引起琐碎的内存管理问题:)

【讨论】:

以上是关于自动引用计数混淆的主要内容,如果未能解决你的问题,请参考以下文章

swift 学习之自动引用计数

自动引用计数ARC

[OC学习笔记]自动引用计数

关于自动引用计数,我需要了解啥?

[OC学习笔记]自动引用计数初学

Swift学习笔记-自动引用计数弱引用和无主引用