2010-07-24 2 views
5

학습 목표 C를 얻었지만 지금은 돌아 왔고 이것이 나를 미치게 만들었습니다.목표 C - NSArray 및 For 루프 구조

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) 24 개체를 제외하고 너무 같은있는 NSArray입니다 :

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 :] : 나는 그런

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

등 다양한 구성을 시도했습니다

경계 [0 .. 23] '넘어 인덱스 24 만 얻을 수 2010-07-24 19시 51분 : 01.017 iCardz2go 포인 덱스터 [29908 : 207] *** 인해 캐치되지 않는 예외 'NSInvalidArgumentException'응용 프로그램 종료, 이유는 : '+ [있는 NSInvocation invocationWithMethodSignature :] : 메소드 서명 인수는 nil이 될 수 없다'그래서는 전무 및 전달을 읽는 것

을 그것.

내가 잊어 버린 단순한 무언가가 될 것임을 알고 있습니다. 왜 사진 23 (카운트)에서 루프를 뛰어 넘지 않습니까?

귀하의 도움에 감사드립니다. P

+0

어떻게 카운트가 23이 될 수 있습니까? –

+0

C 프로그래밍 언어로 자습서를 작성해야 루프와 같은 구문을 다룰 수 있습니다. Objective-C는 C 위에 매우 얇은 레이어이므로 C를 익히는 것이 Objective-C에 대한 이해를 돕습니다. – dreamlax

+0

Marcelos - NSArray가 0에서 계산 된 것으로 생각했기 때문에 ... 그렇지 않습니까? –

답변

12

: 당신은 루프를 설정 곳

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

initialization이다; 그것은 당신이 무엇부터 시작해야 할지를 말해주는 곳입니다. condition은 첫 반복을 포함하여 각 반복마다 테스트됩니다. condition이 true로 평가되면 루프의 본문이 실행됩니다. 각 반복의 끝에서 increment이 평가됩니다.

그래서 : 9까지의 숫자 0을 출력합니다

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

은 당신이 아마 당신에 대해 원하는 것은 :

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

감사합니다. 여전히 충돌 : 'NSInvalidocationException', 이유 : '+ [NSInvocation invocationWithMethodSignature :] : 메서드 시그니처 인수를 사용할 수 없습니다.'오류 메시지를 해석하기에 충분하지 않습니다. –

+0

클래스가 실제로'-savedPhotoImage : didFinishSavingWithError : contextInfo :'에 응답합니까? 구현되었는지 확인해야합니다. –

+0

감사합니다! 그게 문제 였어! 나는 그것을 테스트하는 것을 주석으로 치는 것을 기억한다. .. 무엇인가. .. 2,3 일 전에 그리고 낮았고, 보라, 그것은 아직도 해설되었다! 그러나 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

감사합니다! 나는 지금까지 빠른 열거를 듣지 못했다. 배울 것이 너무 많다. –

+0

그러나 오류가 발생하여 카메라 롤에 쓰기 전에 코드가 충돌합니다. 'NSInvalidArgumentException', 이유 : '+ [NSInvocation invocationWithMethodSignature :] : 메서드 서명 인수를 사용할 수 없습니다.' 루프를 가지고 말하자. (위의 코드에서 실수가있다. 실제로는 ... 루프를 거쳐 이미지를 쓰고 충돌한다.) –

4

모두를위한 루프 조건 — [photoList count]1<23 — 항상 true로 평가합니다. 시도해보십시오 i < [photoList count]. 더 나은 방법은 @ Eimantas의 대답을 사용하는 것입니다. C에서 루프와 같은 목표 - C 모양에 대한

+0

고맙다. –

+0

i <= [포토리스트 개수]를 사용하면 실행 후 다음과 같이 충돌 함 : 캐치되지 않은 예외 'NSRangeException'으로 인해 앱 종료 중, 이유 : '*** - [NSArray objectAtIndex :] : 경계 24를 넘어서서 인덱스 24 [..문제를 좁히는 데 도움이되는가요? –

0

:

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

조건 [photoList count]은 항상 사실이다. 전체 토론을 읽지는 않았습니다.

0

변경 당신의 문에에 (전 = 0; i가 < [목록 (PhotoList) 카운트] 내가 ++) 24 개 오브젝트가있는 경우