【问题标题】:Under ARC, is there any difference between [[X alloc] initWith..] and [X xWith…]?在ARC下,[[X alloc] initWith..]和[X xWith...]有什么区别吗?
【发布时间】:2012-06-05 22:08:53
【问题描述】:

以 NSMutableArray 为例:

NSMutableArray* a1 = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* a2 = [NSMutableArray arrayWithCapacity:10];

在手动引用计数下,第二行返回了一个自动释放的对象。现在启用 ARC,第二个返回 __autoreleasing 对象而另一个不返回吗?有什么区别,如果有的话?

如果我正在初始化的类是一个已转换为 ARC 的自定义类,其中的转换从初始化程序中删除了自动释放消息:

MyClass b1 = [[MyClass alloc] initWithNumber:1];
MyClass b2 = [MyClass myClassWithNumber:1];

// MyClass implementation of myClassWithNumber
+(id) myClassWithNumber:(int)num
{
    return [[self alloc] initWithNumber:num];
}

b1和b2有什么区别,和a1和a2的创建方式有什么不同吗?

【问题讨论】:

标签: objective-c automatic-ref-counting alloc


【解决方案1】:

学习Cocos2D,

ARC 不会更改调用约定。如果您的方法的名称将在 MRR 下返回一个自动释放的对象,那么它将在 ARC 下返回一个。 ARC 是对每种方法的局部优化。这就是为什么您可以在同一个项目中混合和匹配 MRR 和 ARC 代码。 (甚至类别也可以有不同的内存管理方法。)

在您的第二个代码示例中,ARC 将自动释放添加到返回值(如果需要)。为什么是最后一件事?因为 ARC 部分是为了最大限度地减少内存占用。因此,它想要管理在方法中创建的每个对象的生命周期。在方法中创建的唯一会自动释放的对象是返回值。

一般来说,ARC 应该对您的代码具有最小的侵入性。基本上,您将内存管理的责任移交给编译器。 (无论如何,它总是应该存在的地方。) ARC 表面的问题是将免费桥接 CF 对象带入 Objective-C 代码。大多数情况下,使用 __bridged 存储修饰符处理免费桥接项目。 Apple 的 ARC 文档非常好。 Clang 文档是准确的。

不要为 ARC 出汗。与现代编译器的情况一样,它可能会比您更好地管理内存。

安德鲁

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2011-05-10
    • 2012-08-09
    • 2016-07-23
    • 2020-05-01
    相关资源
    最近更新 更多