我一直在阅读自动引用计数的不同来源,但没有找到任何可以澄清我理解的精彩文章或文档。我对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];
任何输入都会有所帮助,谢谢
干杯!
答案 0 :(得分:6)
是和否:
是的,ARC让您无法手动调用retain
,release
,autorelease
,可能会让您删除相当多的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非常需要从你手中进行内存管理的麻烦,让编译器处理所有这些事情。坐下来,放松,更担心编写你想要的代码,而不是造成琐碎的内存管理问题:)