自动引用计数的困惑

27 浏览
0 Comments

自动引用计数的困惑

我一直在阅读不同的自动引用计数的来源,但没有找到任何能够澄清我的理解的好文章或文档。我对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日
0
0 Comments

你的示例代码是正确的。ARC会为您执行那些调用。

但是,如果ARC没有完全接管,新手仍需了解内存管理。不过就像苹果所说的,它让您集中关注对象所有权,而不是保留计数。

例如,如果您不使用__weak__unsafe_unretained修改NSObject *_delegate;,仍然会创建保留循环。

0
0 Comments

是和否:

是的,ARC免去了您手动调用retainreleaseautorelease,可能使您删除相当多的dealloc实现,并且在新运行时甚至引入了零化弱引用(w00t!),但它不会防止您泄漏内存

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

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

ARC实际上比以前更多地让您编写代码的领域是:当您在CFTypeRefid 之间使用免费的桥接时:
必须注释强制转换以告诉ARC该做什么,否则您将收到编译器错误。

如果您正在使用普通的CF API,则不会更改任何内容:所有内容都保持手动操作。

我发现有关ARC的最佳资源是Chris Parker在ARC Internals上的WWDC演讲。如果您还没有看过它,一定要看一看 - ARC的一般部分始于约8分钟处,细节部分始于约29分钟处。

0