Allen Woody

如果你像程序员一样工作,你就是程序员。如果你像架构师一样工作,你就是架构师。

嗨,我是朱洪伍 (@hnxyzhw),一名 iOS 开发者。现居北京,就职于中化能源科技有限公司。正在get新技能,探求创意之源。


我在简书上创建的有关于iOS开发的技术专辑,欢迎各位前来了解!

#文章内容

iOS自定义debug模式下的NSLog宏输出

在debug模式下的时候需要把所在的类名、方法名、行数等相关信息也打印出来,这样在开发的时候就可以快速定位调试的位置,以及当前的调试信息。对于解决bug来说,这是一个非常有效率的方法。 同时在发布模式下,我们可以不输出打印这些数据,不会造成冗余数据的产生。

先介绍一些参数: (1) __VA_ARGS__是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的”,”去掉的作用,否则会编译出错, 你可以试试。 (2) __FILE__宏在预编译时会替换成当前的源文件名。 (3)__LINE__宏在预编译时会替换成当前的行号。 (4) __FUNCTION__宏在预编译时会替换成当前的函数名称。

最简单的一个例子:

#ifdef DEBUG
  #define MYLog(fmt, ...) NSLog((fmt), ##__VA_ARGS__);
  #else
  #define MYLog(...);
  #endif

输出当前方法名

#define MYMethod(...) NSLog(@"%s", __func__);

整理

#ifdef DEBUG
  #define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
  #define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
  #define NSLog(...) NSLog(__VA_ARGS__);
  #define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
  #else
  #define DLog(...)
  #define DeBugLog(...)
  #define NSLog(...)
  #define MyNSLog(FORMAT, ...) nil
  #endif

上一篇文章

app审核中遇到的问题01(关键字被拒)

2016年11月24日 上午8:07发件人 Apple2.3 PERFORMANCE: ACCURATE METADATAPerformance - 2.3.7Your app name to be displayed on the App Store includes keywords or descriptors, which are not appropriate for use in an app name.Specifically, the following words in ...…

iOS,AppleStore继续阅读
下一篇文章

title和leftBarButtonItem不显示

之前自定义了navigationBar的背景颜色,升级到iOS10后,发现title,跟leftBarButtonItem不显示。iOS9 之前的navigationBar的背景是_UINavigationBarBackground,到iOS变成了_UIBarBackground,可以通过xcode查看一下相应的布局。我的解决办法是,分别判断iOS10,iOS9的版本,找到对应的背景图,将起隐藏掉,可以消除分割线。然后重新创建一个视图层,颜色可以自定义,需要注意在添加视图或者更新视图时要放...…

继续阅读