2010-07-24 3 views
5

Работа была на пути к обучению Objective C, но я вернулся к ней сейчас, и это сбило меня с ума.Цель C - NSArray и For loop structure

Это мой код:

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 это просто 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 Пойндекстер [29908: 207] *** Нагрузочного приложения из-за неперехваченное исключение «NSInvalidArgumentException», причина: «+ [NSInvocation invocationWithMethodSignature]: метод подпись аргумент не может быть нулевым»

Так он читает ноль и прохождение Это.

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

Ваша помощь очень признательна! P

+0

Как счет может быть 23, если есть 24 объектов? –

+0

Вам следует заняться учебным курсом на языке программирования C, поскольку он, мы надеемся, будет охватывать такие конструкции, как циклы. Objective-C - довольно тонкий слой поверх C, поэтому ознакомление с C поможет вам справиться с Objective-C. – dreamlax

+0

Марселос - Потому что я думал, что NSArray подсчитан от 0 ... не так ли? –

ответ

12

Для петель в 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].)

Это помогает?

+0

Спасибо также. По-прежнему сбой: Завершение приложения из-за неотображенного исключения «NSInvalidArgumentException», причина: «+ [NSInvocation invocationWithMethodSignature:]: аргумент подписи метода не может быть nil« Это заставляет меня гайки, потому что я недостаточно знаю, чтобы интерпретировать сообщение об ошибке. –

+0

Отвечает ли ваш класс на '-savedPhotoImage: didFinishSavingWithError: contextInfo:'? Вы должны убедиться, что это реализовано. –

+0

СПАСИБО! Это была проблема! Я помню, как комментировал это тестирование ... что-то ... пару дней назад и низко, и вот, это все еще было прокомментировано !!!! Но поскольку я впервые играл с NSArray и получаю настоящий продвинутый (LOL!), Поставив его в цикл, я автоматически предположил, что проблема была там. Ваша помощь и те, что выше, чрезвычайно оценены мной и другими новичками. Обычно я могу найти ответ только путем поиска, но это меня насторожило. Спасибо всем! Надеюсь, однажды я смогу сделать то же самое для людей. –

19

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

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

    UIImageWriteToSavedPhotosAlbum(sendImage, self, @selector(savedPhotoImage:didFinishSavingWithError:contextInfo:), NULL);} 
} 
+0

Спасибо! Я до сих пор не слышал о быстром перечислении ... так много узнать. Но с помощью вашего кода он выходит из строя, прежде чем он записывает в рулон камеры с той же ошибкой: Завершение приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «+ [NSInvocation invocationWithMethodSignature:]: аргумент подписи метода не может быть nil ' –

+0

То есть скажем, с циклом (и theres ошибка в коде, напечатанном выше, это на самом деле i <[кол-во фотолистов] ... он проходит через цикл, записывает изображения, а затем падает. –

4

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

+0

Большое вам спасибо ... это было я <[список фотолистов] Я не знаю, что произошло при вставке. Но это не исправляет. –

+0

Используя i <= [кол-во фотолистов], он запускается, а затем сбой: Завершение приложения из-за неперехваченного исключения «NSRangeException», Причина: '*** - [NSArray objectAtIndex:]: индекс 24 за пределами границ [0 .. 23]' Помогает ли это решить проблему? –

0

Из кода:

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

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

0

Изменение вашего для заявления в течение (I = 0; я < [число photoList]; я ++)