Цель C - NSArray и для структуры цикла - PullRequest
5 голосов
/ 24 июля 2010

Работа мешала изучению Objective C, но я вернулся к этому сейчас, и это сводит меня с ума.

Это мой код:

i=0;
    for (i=0;[photoList count]; i++) {
        NSLog(@"%i",i);
        NSLog(@"%@",[photoList objectAtIndex:i]);
        NSString *fileName = [photoList objectAtIndex:i];
        sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:nil]];
        UIImageWriteToSavedPhotosAlbum(sendImage,self,@selector(savedPhotoImage:didFinishSavingWithError:contextInfo:),NULL);}

photoList isпросто как NSArray, за исключением 24 объектов:

NSArray* photoList = [NSArray arrayWithObjects:@"Photo 1.jpg",
    @"Photo 2.jpg",
    @"Photo 3.jpg",
    @"Photo 4.jpg",nil];

Работает ... Копирует фотографии в рулон камеры ... и затем вылетает с

2010-07-24 19: 34: 36.116 iCardz2go Poindexter [29662: 207] * Завершение работы приложения из-за необработанного исключения 'NSRangeException', причина: '* - [NSArray objectAtIndex:]: индекс 24 за пределами [0 .. 23] '

Я пробовал различные конфигурации, такие как

for (i=0;1<23; i++)

только для получения 2010-07-24 19: 51: 01.017 iCardz2go Poindexter [29908: 207] *** Завершение приложенияиз-за неперехваченного исключения NSInvalidArgumentException, причина: '+ [NSInvocation invocationWithMethodSignature:]: аргумент сигнатуры метода не может быть nil'

Итак, он читает ноль и передает его.

Я знаю, что происходитчтобы быть чем-то очень простым, что я забыл.Почему это не выпрыгивает из цикла на Фото 23 (количество)?

Ваша помощь очень ценится!P

Ответы [ 5 ]

19 голосов
/ 24 июля 2010

Почему бы вам не попробовать быстрое перечисление?

for (NSString *photoFile in photoList) {
  NSLog(@"%@", photoFile);
  sendImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
                               pathForResource:photoFile 
                                        ofType:nil]];

  UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);}
}
12 голосов
/ 24 июля 2010

Для циклов в C и Objective-C выглядят так:

for (initialization; condition; increment) {
    // body
}

initialization - это место, где вы устанавливаете цикл;это где вы говорите, с чего начать.condition проверяется для каждой итерации, включая первую;если condition оценивается как true, тело цикла выполняется.В конце каждой итерации оценивается increment.

Итак:

for (int i = 0; i < 10; i++) {
    printf("%i\n", i);
}

Напечатает числа от 0 до 9. То, что вы, вероятно, хотите получить, это:

NSUInteger count = [photoList count];
for (NSUInteger i = 0; i < count; i++) {
    NSString *fileName = [photoList objectAtIndex: i];
    sendImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: fileName ofType: nil]];
    UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);
}

Обратите внимание на присвоение count вне цикла;это просто оптимизация, поэтому цикл не должен посылать дополнительное сообщение для каждой итерации (вы могли бы просто i < [photoList count].)

Помогает ли это?

4 голосов
/ 24 июля 2010

Оба условия цикла - [photoList count] и 1<23 - всегда оцениваются как true.Попробуйте i < [photoList count].Еще лучше, используйте ответ @ Eimantas.

0 голосов
/ 29 января 2014

Измените свой оператор for на (i = 0; i <[photoList count]; i ++) </p>

0 голосов
/ 23 мая 2011

Из вашего кода:

for (i=0;[photoList count]; i++)

Условие [photoList count] всегда верно. Я не читал всю дискуссию.

...