2012-04-11 1 views
3

저는 IOS 개발을 막 배우기 시작했습니다. 이 프로그램을 실행할 때마다 콘솔에 NSLog가 항상 표시되는 것은 아닙니다.Xcode, 일부 NSLog 항목이 콘솔에서 생략 된 이유는 무엇입니까?

#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSMutableArray *items = [[NSMutableArray alloc] init]; 

     [items addObject:@"One"]; 
     [items addObject:@"Two"]; 
     [items addObject:@"Three"]; 

     [items insertObject:@"zero" atIndex:0]; 

     NSLog(@"Object at 0 is %@", [items objectAtIndex:0]); 
     NSLog(@"Object at 1 is %@", [items objectAtIndex:1]); 
     NSLog(@"Object at 2 is %@", [items objectAtIndex:2]); 
     NSLog(@"Object at 3 is %@", [items objectAtIndex:3]); 

     for (int i = 0; i < [items count]; i++) { 
      NSLog(@"%@", [items objectAtIndex:i]); 
     } 
     items = nil;   
    } 
    return 0; 
} 

나는 콘솔에 내가 그것을 실행할 때마다이 점점해야합니다

2012-04-11 16:29:10.419 RandomPossessions[701:403] Object at 0 is zero 
2012-04-11 16:29:10.421 RandomPossessions[701:403] Object at 1 is One 
2012-04-11 16:29:10.422 RandomPossessions[701:403] Object at 2 is Two 
2012-04-11 16:29:10.422 RandomPossessions[701:403] Object at 3 is Three 
2012-04-11 16:29:10.423 RandomPossessions[701:403] zero 
2012-04-11 16:29:10.423 RandomPossessions[701:403] One 
2012-04-11 16:29:10.424 RandomPossessions[701:403] Two 
2012-04-11 16:29:10.424 RandomPossessions[701:403] Three 

를하지만 가끔은 모두 표시 아니에요. 또 다른 시간 나는 그것을 실행하고 난 그냥 얻을 수는 :

2012-04-11 16:48:20.626 RandomPossessions[734:403] Object at 0 is zero 
2012-04-11 16:48:20.628 RandomPossessions[734:403] Object at 1 is One 

나는 콘솔에 출력 NSLogs의 전체 목록을 얻으려면 프로그램을 여러 번 실행해야합니다. 이것은 버그입니까, 아니면 제가 잘못하고있는 것입니까? 감사합니다.

+1

중단 점을 추가 했습니까? (코드 왼쪽에 파란색이 표시됨) –

+0

감사합니다. 이것은 확실히 도움이됩니다. return 문에 중단 점을 넣습니다. 이제 모든 로그가 콘솔에 출력됩니다. 어떤 이유에서 중단 점없이이 작업을 수행하지 않는 이유는 무엇입니까? – Waynelee3d

+0

죄송 합니다만 처음 오해했습니다. 나는 당신이 나에게 중단 점을 넣을 의도가 있다고 생각했다. 나는 처음에는 프로그램에서 중단 점이 없었다. 그러나 하나를 추가하면 모든 NSLog가 출력됩니다. 중단 점이 없으면 일부 NSLog 출력이 누락됩니다. – Waynelee3d

답변

5

매력적인. 방금 코드를 시도하고 같은 결과를 얻었습니다.

설정하여 줄에 중단 점 :

[items insertObject:@"zero" atIndex:0]; 

디버거가 도착

는, 디버그 패널이 하나 개의 스레드를 보여줍니다 여기 내 가설이다. 지금 3 개 스레드가

지금

NSLog(@"Object at 1 is %@", [items objectAtIndex:1]); 

앞으로 단계입니다.

다른 두 스레드가 로그에 실제 쓰는 중입니다. 개별 스레드가 로그에 기록되기 전에 프로그램이 완료되면 로그가 기록되지 않고 로그가 작성됩니다.

나는 main 함수의 끝에서

sleep(0); 

에 전화를 추가했는데, 갑자기 로그는 적절하게 나타나기 시작.

그런 다음 해당 줄을 제거하고 원래 증상이 사라 졌으므로 더 이상 문제를 재현 할 수 없습니다.

결론 : 로그를 작성하기 전에 종료하는 프로그램의 증상이라고 생각합니다. iOS 앱을 작성하는 경우 이런 종류의 문제에 대해 걱정할 필요가 없습니다. 그것은 단지 불분명 한 구현 세부 사항입니다.

행운을 빕니다.

fflush(stdout); 

또는 NSFileHandle 사용 :

+0

나는 수면을 시도했다 (0); 그것은 나를 위해 아무 것도하지 않았습니다. 그러나 로그를 작성하기 전에 프로그램이 종료되는 다중 스레드 문제가 올바른 것으로 보입니다. return 문 바로 앞에 중단 점을 넣고 모든 로그가 매번 올바르게 표시됩니다. 감사합니다 – Waynelee3d

+0

Richard J. Ross가 fflush()와 올바른 전략을 가지고 있다고 생각합니다. 나는 그의 대답을 반대표를 찍었고, 나는 그것을 시도해야한다고 생각한다. –

+0

Im return 문 앞에 끝 부분에 flush (stdout)를 둡니다. 그래도 내 기록은 아직 없습니다. 나는 그것을 올바르게하고 있는지 나는 모른다. – Waynelee3d

3

사용 fflush()은 응용 프로그램을 종료하기 전에 버퍼 쓰기

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

나는 이것을 시도했다. 나는 아무것도 할 수없는 것처럼 보입니다. 내 NSLog가 아직 없습니다. – Waynelee3d

+1

아마도 fflush (stderr) 여야합니다. –