NSMutableArray:replaceObjectAtIndex vs assignment

Alt*_*cho 2 objective-c automatic-ref-counting

我有一个可变数组:

NSMutableArray *array;
Run Code Online (Sandbox Code Playgroud)

其中包含许多对象.

我应该使用以下哪一项:

[array replaceObjectAtIndex:10 withObject:anObject];
Run Code Online (Sandbox Code Playgroud)

VS:

array[10] = anObject
Run Code Online (Sandbox Code Playgroud)

在ARC环境中?

编辑:我假设replaceObjectAtIndex:方法将在手动参考计数环境中发送一个释放方法,而直接赋值则不会.如果我使用直接赋值,那么它是否会混淆ARC编译器?

nkl*_*uza 10

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

锵文档解释了写作(分配)是阵列式下标转换为一个呼叫setObject:atIndexedSubscript:.

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

[array setObject:anObject atIndexedSubscript:10];
Run Code Online (Sandbox Code Playgroud)

这很重要,因为setObject:atIndexedSubscript:的行为与 replaceObjectAtIndex:withObject:不同.Apple的 setObject 文档:atIndexedSubscript:解释了差异(强调我的):

如果索引等于count,则将元素添加到数组的末尾,从而增大数组.

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

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

  • @Alterecho,这里没有直接的任务.有一个方法调用,*看起来像一个赋值.这只是语法糖. (2认同)