自动引用计数混淆

Tea*_*App 0 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];
Run Code Online (Sandbox Code Playgroud)

如果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];
Run Code Online (Sandbox Code Playgroud)

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

干杯!

dan*_*dee 6

是和否:

是的,ARC赶走你的手动调用retain,release,autorelease,可能让你删除了不少你的dealloc实现和-在新的运行时间-即使引入了零弱引用(!w00t),但它并不妨碍你泄漏本身.

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

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

在大多数情况下,ARC实际上让你编写比以前更多的代码的区域是在CFTypeRefs和id <NSObject>s 之间使用免费桥接时:
必须注释演员以告诉ARC要做什么或者你将要做什么得到一个编译错误.

如果你正在使用普通的CF API,没有任何改变:一切都保持手动.

我发现ARC的最佳资源之一是Chris Parker关于ARC Internals的WWDC演讲.如果你还没有看到它,你一定要检查一下 - ARC的一般部分开始大约8分钟,而细节开始大约29分钟.