有个项目困扰我很久了,Xcode7运行起来之后NSLog不打印到Xcode的控制台上,而是打印在Simulator.app -> Debug ->Open System Log 中,而且还是偶发的,而且诡异的是团队中所有成员对于这个项目都有这个问题,十次有一两次能打印到Xcode控制台。甚是无语。
最近Xcode8发布了,发现Xcode8运行起来App后控制台打印出来一堆乱七八糟的Log,解决方法是
Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables
增加 "OS_ACTIVITY_MODE" 值为 "disable",并勾选(注意如果真机运行的时候不打印NSLog,要取消勾选),重新run即可消失。所以我想是不是和某个环境变量的设置有关。
搜索一下Apple关于NSLog
的文档。我们会发现NSLog
方法中调用的是NSLogv
方法。Apple文档中对于NSLogv
函数是这样写的Logs an error message to the Apple System Log facility
(参见https://developer.apple.com/reference/foundation/1395074-nslogv?language=objc)。
这句话有两个信息我们需要重点关注下,一个就是error message,还有一个就是Apple System Log
1.NSLog工作流程
当我们写了一句NSLog
的时候,他会做两件事情:
一般开发的时候程序都是从Xcode中启动,所以这个时候NSLog就具有打印信息到终端的能力就像printf一样(说fprintf(stderr, ….) 更合适一点)。而且很自然也就认为NSLog只是用来打印这些调试信息用的。
但是当程序不是从Xcode或者ternimal启动等时,因为stderr不是被定向到标准终端,这个时候NSLog的功能就是把信息输入到System Log中去。如果这个时候你也用的stderr输入信息,这个时候stderr会被定向到System Log中去。
再有一个,官方Xcode 8 beta release notes写道
When debugging an app running on Simulator, logs may not be visible in the console. Workaround: Use command + / in Simulator.app to open the system log in the Console app to view NSLogs. (26457535)
意思在模拟器开启状态下,按下command + / 查看log。
虽然苹果表明NSLog不打印输出到控制台是正常情况,我在想是什么原因的,为什么我那个项目,所有人都会有个这个问题,其他项目完全没问题。说与项目无关我都说服不了我自己,有知道为什么的可以给我留言!!!!!!
临时解决办法使用printf代替NSLog
1 2 3 |
#ifndef __OPTIMIZE__ #define NSLog(...) printf("%f %s\n",[[NSDate date]timeIntervalSince1970],[[NSString stringWithFormat:__VA_ARGS__]UTF8String]); #endif |
转载请注明:天狐博客 » Xcode控制台不打印NSLog