Xcode,为什么控制台中省略了一些NSLog条目?

时间:2012-04-11 15:59:28

标签: objective-c xcode console nslog

我刚开始学习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的完整列表。这是一个错误,还是我做错了什么? 感谢

2 个答案:

答案 0 :(得分:5)

魅力。我只是尝试了你的代码并获得了相同的结果。这是我的假设:

在您的行上设置断点:

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

当调试器到达时,调试面板显示一个线程。

现在前进到

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

现在有3个主题。

我打赌其他2个线程正在对日志进行实际写入。如果程序在这些单独的线程写入日志之前完成,那么它们就会被杀死,并且您的日志不会被写入。

我尝试添加对

的调用
sleep(0);

在主函数结束时,突然开始正确显示日志。

然后我尝试删除该行,原来的症状消失了,我再也无法重新创建你遇到的问题了。

结论:我认为这是在编写日志之前程序退出的症状。如果您正在编写iOS应用程序,则无需担心此类问题。这只是一个模糊的实现细节。

祝你好运。

答案 1 :(得分:3)

在退出应用程序之前使用fflush()写出缓冲区:

fflush(stdout);

或使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile];