NSArray размер и изменчивость - PullRequest
1 голос
/ 24 ноября 2011

В Java я обычно инициализирую массивы определенного размера, а затем добавляю и заменяю объекты по мере продолжения работы моего кода.В Objective C я не могу сделать это с NSArray.Код, который я перенес из Java, часто должен использовать NSMutableArray, который, как я полагаю, выполняет менее эффективно, чем NSArray.(Мое лучшее предположение о том, как NSMutableArray хранит своих членов, использует связанный список, но я могу ошибаться)

Существуют ли какие-либо типы массивов для Objective C, которые имеют фиксированные размеры и допускают изменения в массиве?Почему невозможно заменить объекты на определенном объекте NSArray?Я могу сделать это с массивами C, почему бы не Objective C?

Ответы [ 4 ]

6 голосов
/ 24 ноября 2011

Ваше предположение неверно, NSMutableArray не будет медленнее, чем простая NSArray.

NSMutableArray не будет использовать связанный список, он будет использовать динамический массив .Это так же быстро, как простой массив, за исключением вставок, где он должен изменить размер.Но так как они экспоненциально расходятся друг от друга, он амортизируется почти до того же уровня и идентичен, если вы не изменили размер.

По сути, это то же самое, что и Java ArrayList.

2 голосов
/ 24 ноября 2011

Не думайте, что NSMutableArray слишком медленный для вас. Профиль, не спекулируйте.

Вы также можете проверить NSPointerArray, если вы разрабатываете приложение для Mac OS X. Это не доступно на iOS.

2 голосов
/ 24 ноября 2011

В Objective-C многие классы имеют изменяемые и неизменные варианты. Для неизменяемых NSArrays могут быть преимущества в производительности или памяти, но если вам требуется массив, который можно изменить, просто используйте NSMutableArray.Нет причин для беспокойства или тревоги.Вот для чего они здесь.

Вы можете инициализировать изменяемые массивы с намеченной емкостью, хотя вы не навсегда ограничены этой емкостью - массив при необходимости вырастет до предельной емкости.* Любое преимущество оптимизации, доступное NSArray, зависит от того, является ли оно неизменным.Таким образом, не говоря уже о синтаксисе, вы не можете реализовать преимущества неизменяемого объекта, когда то, что вам нужно на самом деле использовать, является изменчивым (например, вам нужно заменить объекты в вашем случае).

1 голос
/ 24 ноября 2011

Вы должны использовать NSMutableArray, если хотите заменить определенный объект.И создайте массив, используя

 + (id)arrayWithCapacity:(NSUInteger)numItems   

или

- (id)initWithCapacity:(NSUInteger)numItems

из NSMutableArray и укажите размер массива.

...