iOS开发一些关键字和宏

遇到了一个问题,想到了另一个问题

本文是对开发中遇到的相关问题的一个小的总结,也是一个知识的学习的过程。有不妥之处,忘大家批评指正!

#ifdef DEBUG
#define MYLog(format, ...) NSLog((@"[File-%s] [Line-%d] %s "   
\format),__FILE__, __LINE__, __PRETTY_FUNCTION__,  
\##__VA_ARGS__)
#else
#define MYLog(...)
#endif

说明:

  • FILE 文件名(全路径)-关键字
  • LINE 代码所处的行号 -关键字
  • PRETTY_FUNCTION 函数名称 -关键字
  • VA_ARGS GNUC中的 可变参数 宏,这里用于将 '...'所代表的内容原样,抄写在VA_ARGS处。
FOUNDATION_EXPORT void NSLog(NSString *format, ...)  
NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;

NSLog使用了宏NS_FORMAT_FUNCTION,NS_FORMAT_FUNCTION定义如下

#if !defined(NS_FORMAT_FUNCTION)
    #if (__GNUC__*10+__GNUC_MINOR__ >= 42) && (TARGET_OS_MAC || TARGET_OS_EMBEDDED)
    #define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
    #else
    #define NS_FORMAT_FUNCTION(F,A)
    #endif
#endif

--attribute--是 GUN C的特色之一,在Foundation.framework中有很多应用。
主要有以下几种使用方式:

  • 函数属性(用在函数上)
  • 变量属性 (用在变量上)
  • 类型属性(用在类型上)

在iOS中的使用主要有以下几种:

  • format 如NS_FORMAT_FUNCTION的定义中。最终用在了NSLog()函数上,用于提示用户,NSLog()的输入是否符合要求。format的语法格式为:
    format (archetype, string-index, first-to-check)。
    format属性告诉编译器,按照printf, scanf,strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。NSLog()这里使用type为NSString,即按照[[NSString alloc]initWithFormat:(NSString*)format ...]格式进行检查。NSLog(), 即第1个参数格式化字符串,从第2个参数开始按上述规则进行检查。

...未完待续

参考文章:
https://www.jianshu.com/p/d0cd6b13fd4b
https://www.jianshu.com/p/6153eccdbe62

你可能感兴趣的:(iOS开发一些关键字和宏)