2009-05-08 3 views
15

У меня есть петля for. Внутри этого цикла я хочу заполнить NSArray некоторыми объектами. Но я не вижу никакого метода, который позволил бы мне это сделать. Я заранее знаю, сколько объектов есть. Я хочу избежать NSMutableArray, так как некоторые люди сказали мне, что это очень большие накладные расходы и производительность-тормоза по сравнению с NSArray.Как я могу заполнить NSArray динамически?

У меня есть что-то вроде этого:

NSArray *returnArray = [[NSArray alloc] init]; 
for (imageName in imageArray) { 
    UIImage *image = [UIImage imageNamed:imageName]; 
    //Now, here I'd like to add that image to the array... 
} 

Я посмотрел в документации NSArray, но как определить, сколько элементов будет там? Или я действительно использую для этого NSMutableArray?

+0

У меня нет времени, чтобы посмотреть это прямо сейчас, но, возможно, вам нужно сначала создать NSMutableArray, а затем использовать метод для этого, чтобы получить неизменяемую версию? Не уверен, что это просто даст вам непревзойденный интерфейс и не получит прирост скорости (т. Е. Может быть такой же основной реализации, как и изменчивый), но стоит посмотреть. Насколько я помню, документы Apple ясны, как грязь на этом. – frankodwyer

+5

Не слушайте людей, которые говорят вам, что что-то плохое! NSMutableArray является основной частью Objective-C, он очень оптимизирован, и нет причин его избегать! –

ответ

28

Да, вы должны использовать NSMutableArray:

int count = [imageArray count]; 
NSMutableArray *returnArray = [[NSMutableArray alloc] initWithCapacity:count]; 
for (imageName in imageArray) { 
    UIImage *image = [UIImage imageNamed:imageName]; 
    [returnArray addObject: image]; 
    ... 
} 

EDIT - объявление неподвижного

+0

Спасибо. Вы уверены, что структура данных переменной имеет тип NSArray, а не NSMutableArray? Или эти взаимозаменяемые? – Thanks

+0

NSMutableArray - подкласс NSArray, поэтому он безопасен. – Alnitak

+0

Да, я забыл. Благодаря! Это вызывает другой вопрос;) – Thanks

3

Будет ли это подходящее время для использования NSMutableArray?

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

4

Для этого вам необходимо использовать NSMutableArray, потому что добавление является мутацией и NSArray является неизменным.

Вы могли бы сделать населенную NSMutableArray в качестве NSArray впоследствии (see here for a discussion), но вы не будете добавлять элементы в обычный старый NSArray в ближайшее время.

2

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

Я предполагаю, что это не будет узким местом производительности вашего приложения.

+0

http://stackoverflow.com/questions/1746204/ для обсуждения производительности. – nschum

Смежные вопросы