10 HOME
20 INPUT N
30 LET ANS = 1
40 FOR I = 1 TO N
50 ANS = ANS * I
60 NEXT I
70 PRINT ANS
Если вы загружаете объекты из базы данных и знаете точно , сколько у вас объектов, вы, вероятно, получите лучшую производительность от NSMutableArray
s arrayWithCapacity:
и добавляя к нему объекты до полного заполнения, поэтому он выделяет всю память сразу, если это возможно.
За кулисами они тайно одно и то же - * NSArray
и NSMutableArray
реализуются с CFArray
s через бесплатный мост (a CFMutableArrayRef
и CFArrayRef
являются typedef одного и того же вещь, __ CFArray *
)
NSArray
и NSMutableArray
должны иметь одинаковую производительность / сложность (время доступа в худшем случае O (lg N) и O (1) ) в лучшем случае), и единственная разница заключается в том, сколько памяти будут использовать два объекта - NSArray
имеет фиксированный предел, в то время как NSMutableArray
может использовать столько места, сколько у вас свободного.
Комментарии в CFArray.h содержат более подробную информацию об этом.
*: Как указывает Catfish_Man ниже, это больше не соответствует действительности.
Это больше не правда. Это больше не правда.Кроме того, NSMutableArray не является потокобезопасным, а NSArray (то же самое со всеми изменяемыми и «неизменяемыми» объектами). Это может стать серьезной проблемой, если вы используете многопоточность.
Вы не можете изменить NSArray
после его создания. Если вам нужно добавить / удалить объекты из вашего массива, вы будете использовать NSMutableArray
- вариантов для этого не так много. Я предполагаю, что NSArray
оптимизирован для операций с фиксированными массивами. Изменяемый массив обеспечивает гибкость и возможность модификации.
Разница в производительности при использовании массива NSArray и массива NSMutable возникает в первую очередь, когда вы используете API, который хочет скопировать массив. если вы отправляете -copy в неизменяемый массив, он просто увеличивает счетчик сохранения, но отправка -copy в изменяемый массив будет выделять память кучи.