Xcode中,为什么从控制台省略了一些NSLog的条目?(Xcode, Why are some N

2019-09-16 11:26发布

我刚开始学习iOS开发。 每次我运行这个程序,控制台不总是显示我的NSLogs。

#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的完整列表输出到控制台。 这是一个错误,还是我做错了什么? 谢谢

Answer 1:

迷人。 我只是想你的代码,并得到了相同的结果。 这里是我的假设:

设置在您的线路断点:

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

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

现在,向前一步

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

现在有3个线程。

我敢打赌,那些其他2个线程正在做的实际写入日志。 如果程序完成这些单独的线程都写入日志之前,然后他们就被杀死,而你的日志不被写入。

我尝试添加至呼叫

sleep(0);

在主函数的末尾,突然日志开始出现适当。

然后我试图消除这一行,和原来的症状消失了,我再也不能重现您遇到的问题。

底线:我认为这是该程序的日志已被写入前戒烟的症状。 如果你正在写一个iOS应用程序,你会不会担心这种事情。 这只是一个不起眼的实现细节。

祝你好运学习。



Answer 2:

使用fflush()写辞职申请前缓冲区out:

fflush(stdout);

或者使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile];


文章来源: Xcode, Why are some NSLog entries omitted from the console?