2

以 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 的创建方式有什么不同吗?

4

1 回答 1

0

学习Cocos2D,

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

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

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

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

安德鲁

于 2012-06-01T13:20:38.850 回答