iOS 10+ NSLog失效

在做项目的时候遇到了这样的问题,写了一个可以识别多种手势的控件,包括单击,双击,连击,拖动等,在测试手势冲突时发现了奇葩的问题.

首先在手势的响应方法中使用 NSLog 打印出识别出的手势类型,发现打印出的结果断断续续,有时点击两三下打印出一次结果,有时点击一次打印一次,有时连续十几次都没有打印出结果.

照例先说结论:由于 iOS 10 中 NSLog 的改动,导致 NSLog() 方法失灵.

(笔者的电脑是黑苹果,版本号10.11.6), Xcode7.3.1,装了 iOS10 的配置包.

解决方法:使用 printf() 函数代替 NSLog, 可以在宏中定义如下

#ifndef __OPTIMIZE__

#define NSLog(...) printf("%f %s %ld :%s\n",[[NSDate date]timeIntervalSince1970],strrchr(__FILE__,'/'),[[NSNumber numberWithInt:__LINE__] integerValue],[[NSString stringWithFormat:__VA_ARGS__]UTF8String]);

#endif

这个问题坑了我很久,先是检查自己的代码是不是有手势冲突,一个一个的手势注释,又检查视图的响应流程,又检查动画,线程,计时器等等等等,甚至使用了 UIButton 来代替单击手势,问题依然存在.从模拟器换到真机又换回模拟器,模拟器从 iPhone 到 iPad 都换过依然没什么鸟用.

在一筹莫展之时,开始进行逐行的代码分析,通过打断点终于发现方法正常执行,而 NSLog() 这一句在执行时并未打印.

一开始我是不相信 NSLog 会出问题的(尼玛的一开始我也是迷信科学的),但是福尔摩斯(柯南道尔?)有一句话说得好:When you have eliminated the impossible, whatever remains, however improbable, must be the truth. (排除所有的不可能的,剩下的即使再不可思议,那也是真相.)

祝大家代码顺利,永无 bug.

爱你们么么哒(づ ̄ 3 ̄)づ

推荐阅读更多精彩内容