自动引用计数混淆
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 让您摆脱了手动调用 retain
、release
、autorelease
的麻烦,可能让您删除很多 dealloc
实现,并且 - 在新的运行时 - 甚至引入了归零弱引用 (w00t !),但它本身并不能防止您泄露。
它是自动保留/释放,而不是垃圾收集器,因此它“允许”仍然通过创建保留周期来泄漏内存。
此外,它将__block
属性的引用语义从weak
更改为strong
:
您使用 __block id blockSelf = self;
避免捕获 self
的每一段代码现在都可能存在泄漏 — 幸运的是,Clang 已经更好地警告您此类问题。
在大多数情况下,ARC 实际上使您编写的代码比以前更多 的领域是当您在CFTypeRef
s 和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 几乎免除了您进行内存管理的麻烦,并让编译器处理所有这些事情。坐下来,放松一下,更多地担心编写您想要的代码,而不是引起琐碎的内存管理问题:)
【讨论】:
以上是关于自动引用计数混淆的主要内容,如果未能解决你的问题,请参考以下文章