2011-11-27 56 views
0

我一直在阅读不同来源的自动引用计数,但没有找到任何明确我的理解的文章或文档。我对ARC(自动引用计数)的理解是,它完全接管了开发人员对内存管理的控制,并将其分配给编译器进行内存管理。自动引用计数混淆

我想对吗?

那么这是否意味着保留,发布和autorelease不再是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]; 

会变成这个样子IF ARC为ON

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]; 

任何输入将有帮助谢谢

干杯!

回答

6

是的,没有:

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

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

此外,它改变了__block属性的参考语义从weakstrong
在您使用__block id blockSelf = self;避免self捕获的代码的每一位现在是一个潜在的泄漏 - 幸运的是,锵甚至变得更好警告你关于这样的问题。

的区域,其中ARC实际上使你写的比以前代码,大多数时候,是当你正在使用免费电话桥接CFTypeRef S和id <NSObject> S之间:
的强制转换必须注解告诉ARC该做什么或者你会得到一个编译器错误。

如果您使用的是简单CF API,则不会发生任何更改:一切都保持手动。

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

1

您的示例代码是正确的。 ARC为你打电话。但是,ARC并没有“完全接管”新手,但仍然需要了解内存管理。但就像苹果说,它可以让你专注于对象所有权,而不是保留数量。

例如,如果您不修改NSObject <Protocol> *_delegate;__weak__unsafe_unretained您仍将创建一个保留周期。

0

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