Частично ответили здесь: Размер и изменчивость NSArray
NSMutableArray не заметно медленнее или больше (по памяти), чем NSArray.По сути, это просто NSArray, который перераспределяет себя, когда заполняется, как массив большего размера, и продолжает делать это, когда вы добавляете в него элементы.
Причина копирования изменяемых массивов как неизменяемых при назначении их значениям в вашемкласс, так что вы можете гарантировать, что их значения не меняются.Если вы храните изменяемый массив в своем классе, другой код может изменить его значения вне вашего класса, не вызывая ни один из ваших методов.Это делает вас уязвимым к сбоям из-за внутренних ошибок непостоянства в ваших классах.
Например, предположим, что когда массив был установлен, вы кэшировали длину массива как свойство int в вашем классе.Это было бы хорошо, если бы массив был неизменным, но если бы он был изменяемым, кто-то другой мог бы изменить массив, и ваше кэшированное значение теперь будет неправильным, но у вас нет возможности узнать это.
Однако этоне нужно делать копирование вручную.Если вы объявите свойства массива следующим образом:
@property (nonatomic, copy) NSArray *foo;
Затем, когда вы назначите массив для object.foo, он будет автоматически скопирован.Вам не нужно копировать это снова самостоятельно.Рекомендуется использовать тип свойства copy вместо strong / retain для любого типа, который имеет изменяемый вариант, например:
@property (nonatomic, copy) NSArray *foo;
@property (nonatomic, copy) NSString *foo;
@property (nonatomic, copy) NSDictionary *foo;
@property (nonatomic, copy) NSData *foo;
etc...
Однако будьте осторожны, чтобы не использовать его для изменяемых свойств, иначесделайте неизменную копию, хранящуюся в свойстве, которое думает, что оно изменчиво, и вызывает сбой, если вы пытаетесь изменить его.Свойство синтезированной копии недостаточно интеллектуально, чтобы автоматически использовать mutableCopy.
@property (nonatomic, copy) NSMutableArray *foo; //don't do this