自动引用计数的困惑
自动引用计数的困惑
我一直在阅读不同的自动引用计数的来源,但没有找到任何能够澄清我的理解的好文章或文档。我对ARC(自动引用计数)的理解是,它完全接管了开发人员对内存管理的控制,并将其分配给编译器进行内存管理。
我的想法对吗?
那么,这是否意味着在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];
任何意见都会有所帮助,谢谢!
干杯!
admin 更改状态以发布 2023年5月24日
是和否:
是的,ARC免去了您手动调用retain
,release
,autorelease
,可能使您删除相当多的dealloc
实现,并且在新运行时甚至引入了零化弱引用(w00t!),但它不会防止您泄漏内存。
它是自动保留/释放,而不是垃圾收集器,因此通过创建保留循环,“允许您”仍然泄漏内存。
此外,它将__block
属性的引用语义从weak
更改为strong
:
每一行避免通过使用__block id blockSelf = self;
捕获self
的代码都是潜在泄漏的,幸运的是,Clang已经更好地警告您此类问题。
ARC实际上比以前更多地让您编写代码的领域是:当您在CFTypeRef
和id
之间使用免费的桥接时:
必须注释强制转换以告诉ARC该做什么,否则您将收到编译器错误。
如果您正在使用普通的CF API,则不会更改任何内容:所有内容都保持手动操作。
我发现有关ARC的最佳资源是Chris Parker在ARC Internals上的WWDC演讲。如果您还没有看过它,一定要看一看 - ARC的一般部分始于约8分钟处,细节部分始于约29分钟处。