自动引用计数混淆

时间:2011-11-27 00:39:39

标签: iphone objective-c ios ios5 automatic-ref-counting

我一直在阅读自动引用计数的不同来源,但没有找到任何可以澄清我理解的精彩文章或文档。我对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];

任何输入都会有所帮助,谢谢

干杯!

3 个答案:

答案 0 :(得分:6)

是和否:

是的,ARC让您无法手动调用retainreleaseautorelease,可能会让您删除相当多的dealloc实施,并且 - 在新的运行时 - 甚至引入归零弱引用(w00t!),但它本身并不会阻止你泄漏

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

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

在大多数情况下,ARC实际上让您编写更多代码的区域,就是在CFTypeRef和{{1}之间使用免费桥接的时候}} S:
演员必须注释告诉ARC要做什么,否则你会得到编译器错误。

如果你正在使用普通的CF API,那么一切都没有变化:一切都保持手动。

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

答案 1 :(得分:1)

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

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

例如,如果您未使用NSObject <Protocol> *_delegate;__weak修改__unsafe_unretained,则仍会创建保留周期。

答案 2 :(得分:0)

是的,你是对的。 ARC非常需要从你手中进行内存管理的麻烦,让编译器处理所有这些事情。坐下来,放松,更担心编写你想要的代码,而不是造成琐碎的内存管理问题:)