3

私はIOS開発を学び始めたばかりです。このプログラムを実行するたびに、コンソールに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

コンソールに出力するNSLogの完全なリストを取得するには、プログラムを数回実行する必要があります。これはバグですか、それとも私は何か間違ったことをしていますか?ありがとう

4

2 に答える 2

5

魅力的な。あなたのコードを試してみたところ、同じ結果が得られました。これが私の仮説です:

行にブレークポイントを設定します。

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

デバッガーがそこに到達すると、デバッグ パネルに 1 つのスレッドが表示されます。

今一歩前へ

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

これでスレッドが 3 つになりました。

他の 2 つのスレッドがログへの実際の書き込みを行っているに違いありません。これらの個別のスレッドがログに書き込む前にプログラムが終了した場合、それらは強制終了され、ログは書き込まれません。

に呼び出しを追加してみました

sleep(0);

メイン関数の最後で、突然ログが適切に表示されるようになりました。

その後、その行を削除しようとしましたが、元の症状は消え、あなたが抱えていた問題を再現することはできなくなりました.

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

頑張って学習してください。

于 2012-04-11T17:43:25.957 に答える
3

fflush()アプリケーションを終了する前にバッファを書き出すために使用します。

fflush(stdout);

または使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile];
于 2012-04-11T17:54:40.370 に答える