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