Я думаю, вы, должно быть, неверно истолковали, как работают copy и mutableCopy. В первом примере myArray_COPY является неизменной копией myArray. Сделав копию, вы можете манипулировать содержимым оригинала myArray и не влиять на содержимое myArray_COPY.
Во втором примере вы создаете изменяемую копию myArray, что означает, что вы можете изменить любую копию массива, не затрагивая другую.
Если я изменю первый пример, чтобы попытаться вставить / удалить объекты из myArray_COPY, он потерпит неудачу, как и следовало ожидать.
Возможно, размышление о типичном сценарии использования поможет. Часто бывает, что вы можете написать метод, который принимает параметр NSArray *
и в основном сохраняет его для дальнейшего использования. Вы можете сделать это следующим образом:
- (void) doStuffLaterWith: (NSArray *) objects {
myObjects=[objects retain];
}
... но тогда у вас есть проблема, что метод может быть вызван с NSMutableArray в качестве аргумента. Код, создавший массив, может манипулировать им между тем, когда вызывается метод doStuffLaterWith:, и когда вам позже потребуется использовать значение. В многопоточном приложении содержимое массива может быть даже изменено , пока вы перебираете его , что может вызвать некоторые интересные ошибки.
Если вы вместо этого сделаете это:
- (void) doStuffLaterWith: (NSArray *) objects {
myObjects=[objects copy];
}
.. затем копия создает снимок содержимого массива во время вызова метода.