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

申し訳ありませんが、私は初めてあなたに誤解しました。あなたが私にブレークポイントを入れさせることを意味していると思った。最初はプログラムにブレークポイントはなかった。しかし、1つ追加すると、すべてのNSLogが出力されました。ブレークポイントがない場合、一部のNSLog出力がありません。 – Waynelee3d

答えて

5

魅力的です。私はあなたのコードを試して、同じ結果を得ました。ここに私の仮説です:あなたの行にブレークポイントを設定し

:デバッガはそこに着くとき

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

は、デバッグパネルには、一つのスレッドを示しています。

今すぐ3つのスレッドがある

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

に踏み出します。

私は、他の2つのスレッドがログに実際に書き込んでいることを賭けています。これらの別々のスレッドがログに書き込まれる前にプログラムが終了すると、それらはただ殺され、ログは書き込まれません。

私は、main関数の最後で

sleep(0); 

への呼び出しを追加しようとした、と突然、ログが適切に現れ始めました。

私はその行を削除しようとしましたが、元の症状は消えてしまいました。問題が再現できなくなりました。

ボトムライン:これはログが書き込まれる前に終了するプログラムの症状だと思います。 iOSアプリを作成している場合は、このようなことを心配する必要はありません。それはあいまいな実装の詳細です。

幸運学習。

fflush(stdout); 

するか、NSFileHandleを使用します:

+0

私は睡眠を試みた(0);それは私のために何もしなかった。しかし、ログを書き込む前にプログラムが終了するマルチスレッドの問題は正しいようです。私はreturn文の直前にブレークポイントを置いて、毎回すべてのログが正しく表示されます。ありがとう – Waynelee3d

+0

私はRichard J. Rossがfflush()で正しい戦略を持っていると思います。私は彼の答えを浮き彫りにしました。あなたはそれを試してみるべきだと思います。 –

+0

私は、return文の前に最後にflush(stdout)を入れています。私のログはまだ失われています。私はそれをやっているのかどうか分かりません。 – Waynelee3d

3

使用fflush()は、アプリケーションを終了する前にライトバッファする

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

私はこれを試しました。私はそれが何かをするように見えることはできません。私のNSLogはまだありません。 – Waynelee3d

+1

多分fflush(stderr)でなければなりません。 –

関連する問題