2012-05-14 4 views
-1

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

hopAnimation=[[NSArray alloc] initWithObjects: 
       [UIImage imageNamed:@"frame-1.png"], 
       [UIImage imageNamed:@"frame-2.png"], 
       [UIImage imageNamed:@"frame-3.png"], 
       [UIImage imageNamed:@"frame-4.png"], 
       [UIImage imageNamed:@"frame-5.png"], 
       [UIImage imageNamed:@"frame-6.png"], 
       [UIImage imageNamed:@"frame-7.png"], 
       [UIImage imageNamed:@"frame-8.png"], 
       [UIImage imageNamed:@"frame-9.png"], 
       [UIImage imageNamed:@"frame-10.png"], 
. 
. 
. 
       [UIImage imageNamed:@"frame-100.png"], 
       nil 
       ]; 

Есть ли способ использовать for-loop, чтобы сделать это эффективно?

+0

Что заставляет вас думать, что то, как вы делаете, недостаточно эффективно? –

ответ

1

Вы можете использовать цикл, конечно. Вы можете поместить все имена изображений в plist. Затем вы можете создать массив имен:

NSArray * imageNames = [NSArray arrayWithContentsOfFile:@"/path/to/names.plist"]; 

и цикл через него, чтобы создать массив изображений:

NSMutableArray * images = [NSMutableArray array]; 
for(NSString * imageName in imageNames){ 
    [images addObject:[UIImage imageNamed:imageName]]; 
} 

Или, если ваши файлы изображения действительно названы последовательно, как это, вы можете цикл на целое число и поместите это в строку имени файла:

NSMutableArray * images = [NSMutableArray array]; 
for(int i = 1; i <= numImageFiles; i++){ 
    [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"frame-%d.png", i]]]; 
} 
2

Если предположить, что соглашение об именах согласуется, как это, вы можете использовать изменяемый массив и добавить элементы в цикле:

NSMutableArray *hopAnimation = [[NSMutableArray alloc] initWithCapacity:100]; 

for (int i = 1, i <= 100, i++) { 
    [hopAnimation addObject:[UIImage imageNamed:[NSString stringWithFormat:@"frame-%i.png", i]]]; 
} 
0

Другие люди предложили заполнить ваш массив петлей. Ваша заявленная цель - эффективность, и, если что-либо, цикл будет менее эффективным, то как вы в настоящее время загружаете свой массив. Если вы хотите очистить свой код, то обязательно используйте цикл. Но если вы ищете эффективность, нет возможности заполнить массив, который более эффективен, чем тот метод, который вы используете в настоящее время.

+0

Существует также цикл внутри 'initWithObjects:', чтобы обрабатывать элементы в 'va_list'. –

0

При использовании Clang 3.1 (который, вероятно, прибудет с Xcode 4.4) или выше, вы можете использовать новый массив буквальный синтаксис:

@[ 
    [UIImage imageNamed:@"frame-1.png"], 
    [UIImage imageNamed:@"frame-2.png"], 
    [UIImage imageNamed:@"frame-3.png"], 
    /* ... */ 
] 

Я не нашел никакой информации о том, что он реализован с петлей например, с -initWithObjects: или любыми другими соображениями производительности.

+0

Это не доступно в Xcode 4.3, так как этот компилятор еще не имеет этих функций. Однако будущий выпуск их поддержит. –

+0

К сожалению. Виноват. – echristopherson

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