【问题标题】:Automatic reference counting confusions自动引用计数混淆
【发布时间】:2012-01-07 03:22:30
【问题描述】:

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

我想对了吗?

这是否意味着 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];

任何意见都会有所帮助,谢谢

干杯!

【问题讨论】:

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


    【解决方案1】:

    是与否:

    是的,ARC 让您摆脱了手动调用 retainreleaseautorelease 的麻烦,可能让您删除很多 dealloc 实现,并且 - 在新的运行时 - 甚至引入了归零弱引用 (w00t !),但它本身并不能防止您泄露

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

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

    在大多数情况下,ARC 实际上使您编写的代码比以前更多 的领域是当您在CFTypeRefs 和id <NSObject>s 之间使用免费桥接时:
    必须对强制转换进行注释以告诉 ARC 要做什么,否则会出现编译器错误。

    如果您使用的是普通的 CF API,则没有任何变化:一切都保持手动。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        是的,你是对的。 ARC 几乎免除了您进行内存管理的麻烦,并让编译器处理所有这些事情。坐下来,放松一下,更多地担心编写您想要的代码,而不是引起琐碎的内存管理问题:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          相关资源
          最近更新 更多