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

你有没有添加断点? (代码左边的蓝色东西) – 2012-04-11 16:38:09

+0

谢谢。这绝对有帮助。我在return语句中放置了一个断点。现在我所有的日志都输出到控制台。任何想法为什么它没有这样做没有断点? – Waynelee3d 2012-04-11 17:11:06

+0

对不起,我第一次误解了你。我以为你打算让我把断点放进去。我一开始在程序中没有断点。但是当我添加一个时,我所有的NSLog都得到了输出。如果没有断点,则会丢失一些NSLog输出。 – Waynelee3d 2012-04-11 17:26:16

回答

5

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

设定在您的线路断点:

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

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

现在向前一步

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

现在有3个线程。

我敢打赌,其他2线程正在写日志。如果程序在这些单独的线程写入日志之前完成,那么它们只会被杀死,而您的日志不会被写入。

我试图在主函数的末尾添加一个电话

sleep(0); 

,突然日志开始出现适当。

然后我尝试删除该行,原始症状消失,我不能再重新创建您遇到的问题。

底线:我认为这是程序在日志写入之前退出的一种症状。如果你正在编写一个iOS应用程序,你不必担心这种事情。这只是一个晦涩的实现细节。

祝你好运学习。

+0

我试了睡(0);它没有为我做任何事情。但是在编写日志之前程序退出的多线程事情似乎是正确的。我在return语句之前放置一个断点,并且每次都正确显示所有日志。谢谢 – Waynelee3d 2012-04-11 18:28:06

+0

我认为理查德J.罗斯与fflush()有正确的战略。我提出了他的答案,我认为你应该尝试。 – 2012-04-11 19:01:17

+0

我把flush(stdout)放在return语句前面的末尾。不过,我的日志仍然不存在。我不知道我是否做对了。 – Waynelee3d 2012-04-11 19:59:02

3

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

fflush(stdout); 

或者使用NSFileHandle

[[NSFileHandle fileHandleWithStandardOutput] synchronizeFile]; 
+0

我试过了。我似乎无法让它做任何事情。我的NSLogs仍然缺失。 – Waynelee3d 2012-04-11 19:58:13

+1

也许它应该是fflush(stderr); – 2012-04-11 21:02:35