NSMutableArray:replaceObjectAtIndex vs assignment

时间:2014-08-13 09:30:25

标签: objective-c automatic-ref-counting

我有一个可变数组:

NSMutableArray *array;

其中包含许多对象。

我应该使用以下哪一项:

[array replaceObjectAtIndex:10 withObject:anObject];

VS

array[10] = anObject

在ARC环境中?

编辑: 我假设replaceObjectAtIndex:方法将在Manual Reference Counted环境中发送一个release方法,而直接赋值则不会。如果我使用直接赋值,那么它会让ARC编译器感到困惑吗?

1 个答案:

答案 0 :(得分:10)

这两种方法之间存在细微差别。

Clang documentation解释了写作(赋值)的数组式下标转换为对setObject:atIndexedSubscript:的调用。

因此,从您的示例中,array[10] = anObject;转换为:

[array setObject:anObject atIndexedSubscript:10];

这很重要,因为setObject:atIndexedSubscript:与replaceObjectAtIndex:withObject:的行为不同。 setObject的Apple's documentation:atIndexedSubscript:解释差异(强调我的):

  

如果索引等于count,则元素添加到结尾   数组,增长数组

在您的示例中,如果array的大小为10,则表达式array[10] = anObject;有效;它会增长你的数组并将对象添加到最后。但是,如果您调用[array replaceObjectAtIndex:10 withObject:anObject];,则会抛出NSRangeException异常。

关于在ARC环境中使用哪种方法,我认为这是一个错误的问题。两者之间的差异不依赖于ARC,因此您的决定应该基于预期的行为(可能还有风格)。