2012-04-11 60 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

你有沒有添加斷點? (代碼左邊的藍色東西) – 2012-04-11 16:38:09

+0

謝謝。這絕對有幫助。我在return語句中放置了一個斷點。現在我所有的日誌都輸出到控制檯。任何想法爲什麼它沒有這樣做沒有斷點? – Waynelee3d 2012-04-11 17:11:06

+0

對不起,我第一次誤解了你。我以爲你打算讓我把斷點放進去。我一開始在程序中沒有斷點。但是當我添加一個時,我所有的NSLog都得到了輸出。如果沒有斷點,則會丟失一些NSLog輸出。 – Waynelee3d 2012-04-11 17:26:16

回答

5

迷人。我只是試過你的代碼,得到了相同的結果。這裏是我的假設:

設定在您的線路斷點:

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

當調試器到達那裏,調試面板顯示一個線程。

現在向前一步

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

現在有3個線程。

我敢打賭,其他2線程正在寫日誌。如果程序在這些單獨的線程寫入日誌之前完成,那麼它們只會被殺死,而您的日誌不會被寫入。

我試圖在主函數的末尾添加一個電話

sleep(0); 

,突然日誌開始出現適當。

然後我嘗試刪除該行,原始症狀消失,我不能再重新創建您遇到的問題。

底線:我認爲這是程序在日誌寫入之前退出的一種症狀。如果你正在編寫一個iOS應用程序,你不必擔心這種事情。這只是一個晦澀的實現細節。

祝你好運學習。

+0

我試了睡(0);它沒有爲我做任何事情。但是在編寫日誌之前程序退出的多線程事情似乎是正確的。我在return語句之前放置一個斷點,並且每次都正確顯示所有日誌。謝謝 – Waynelee3d 2012-04-11 18:28:06

+0

我認爲理查德J.羅斯與fflush()有正確的戰略。我提出了他的答案,我認爲你應該嘗試。 – 2012-04-11 19:01:17

+0

我把flush(stdout)放在return語句前面的末尾。不過,我的日誌仍然不存在。我不知道我是否做對了。 – Waynelee3d 2012-04-11 19:59:02

3

使用fflush()寫辭職申請前緩衝區out:

fflush(stdout); 

或者使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

我試過了。我似乎無法讓它做任何事情。我的NSLogs仍然缺失。 – Waynelee3d 2012-04-11 19:58:13

+1

也許它應該是fflush(stderr); – 2012-04-11 21:02:35

相關問題