我有一个可变数组:
NSMutableArray *array;
其中包含许多对象。
我应该使用以下哪一项:
[array replaceObjectAtIndex:10 withObject:anObject];
VS
array[10] = anObject
在ARC环境中?
编辑:
我假设replaceObjectAtIndex:
方法将在Manual Reference Counted环境中发送一个release方法,而直接赋值则不会。如果我使用直接赋值,那么它会让ARC编译器感到困惑吗?
答案 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,因此您的决定应该基于预期的行为(可能还有风格)。