作者: 高乔人 | 来源:发表于2021-10-28 13:49 被阅读0次
首先weakSelf和strongSelf
#define rj_weakify(var) __weak typeof(var) RJWeak_##var = var;

#define rj_strongify(var) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong typeof(var) var = RJWeak_##var; \
_Pragma("clang diagnostic pop")
比如项目中切换环境的宏
1.可以先定义要用到的环境
#define XHW_OPENPRODUCT          0     
#define XHW_OPENPRODUCTEX        0      
#define XHW_OPENUAT              1    
#define XHW_OPENINNER            0    
#define XHW_OPENRET              0    

创建一个网络类处理网络情况
typedef NS_ENUM(NSInteger,XHWNetWorkServiceType) {
    XHWNetworkTypePRODUCT,          
    XHWNetworkTypePRODUCTEX,        
    XHWNetworkTypeUAT,             
    XHWNetworkTypeINNER,            
    XHWNetworkTypeRET,              
};
项目全局只使用这里拿到的网络环境做相应的配置
+(XHWNetWorkServiceType)currentNetWork{
 XHWNetWorkServiceType currentType = XHWNetworkTypeUAT;
#if XHW_OPENPRODUCT
    currentType = XHWNetworkTypePRODUCT;
#elif XHW_OPENPRODUCTEX
    currentType = XHWNetworkTypePRODUCTEX;
#elif XHW_OPENUAT
    currentType = XHWNetworkTypeUAT;
#elif XHW_OPENINNER
    currentType = XHWNetworkTypeINNER;
#elif XHW_OPENRET
    currentType = XHWNetworkTypeRET;
#endif
    return currentType;
}
配置DEBUG宏:
 
#define  定义一个预处理宏
#undef   取消宏的定义
#if      编译预处理中的条件命令, 相当于C语法中的if语句
#ifdef   判断某个宏是否被定义(#define过), 若已定义, 执行随后的语句
#ifndef  与#ifdef相反, 判断某个宏是否未被定义
#elif    若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
#else    与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
#endif   #if, #ifdef, #ifndef这些条件命令的结束标志.
defined   与#if, #elif配合使用, 判断某个宏是否被定义
#pragma  说明编译器信息
#warning 显示编译警告信息
#error   显示编译错误信息
 
配置DEBUG宏:
 
1.在 "Target > Build Settings > Preprocessor Macros > Debug" 设置"DEBUG=1”。

2.之后在pch或工具类中就可以这么写了:
#ifdef DEBUG  
(debug 模式下的配置)
#else  
(release 模式下的配置)
#endif 

#ifdef DEBUG // 调试状态, 打开LOG功能

#define SFString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
//打印出所在文件名,所在行,堆栈地址
#define SFLog(...) printf("%s: %p (line = %d): %s\n\n", [SFString UTF8String] , &self, __LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);

//#else
//#define SFLog(s, ...) NSLog(@"<%@: %p (line = %d)> %@", self.class, self, __LINE__,[NSString stringWithFormat:(s),##__VA_ARGS__])
//#endif

#else // 发布状态, 关闭LOG功能
#define SFLog(s, ...)
#endif

系统宏介绍:

 __LINE__:宏在预编译时会替换成当前的行号

 __FUNCTION__:宏在预编译时会替换成当前的函数名称

__VA_ARGS__:简单的说,就是将左边…的内容替换进来
 
#####详解#ifdef,#elif,#else,#endif,#if等:

 
1:
  #ifdef _XXXX  (ifdef 即 if define )
  ...程序段1...
   #elif defined _YYYY
   ...程序段3...(相当于else if)
  #else
  ...程序段2...
  #endif
   
>这表明如果_XXXX已被#define定义过,则对程序段1进行编译;再如果定义了_YYYY,执行程序段3,否则对程序段2进行编译。

  例: 
  #define NUM
  .............

  #ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
  #else
   printf("之前NUM没有过定义!:( \n");
  #endif

>如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
   我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
 
2: 
  #ifndef _XXXX 
  ...程序段1... 
  #else 
  ...程序段2... 
  #endif

>这里使用了#ifndef,表示的是if not def。和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)
 
3:
  #if 常量 
  ...程序段1...
  #else
  ...程序段2...
  #endif 
  
 >注意:#if后必须跟常量,不能是宏(因为宏是在运行阶段才有,#if是预编译阶段,找不到宏);
  如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
 我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0。
 
常用示例:
 
1.判断当前app所支持的最大最小iOS版本

 
#ifdef __IPHONE_OS_VERSION_MAX_ALLOWED // 当前软件支持的最大ios版本
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000  
      NSLog(@"当前app支持的最大版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);
#else
      NSLog(@"当前app支持的最大版本,%d",__IPHONE_OS_VERSION_MAX_ALLOWED);
#endif
#endif

#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED // 当前软件支持的最小ios版本
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80400
      NSLog(@"当前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#else
     NSLog(@"当前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#endif
#endif
 
2.判断真机/模拟器

 
#if TARGET_OS_IOS
    NSLog(@"真机测试");
#endif

#if TARGET_IPHONE_SIMULATOR
    NSLog(@"模拟器");
#endif
 
3.获得当前设备的iOS版本 

 
#define kIOSVersion  [[UIDevice currentDevice].systemVersion doubleValue]
 
4.字体(带参数的宏)

 
#define SFSystemFont(FONTSIZE) [UIFont systemFontOfSize:FONTSIZE]
 
5.weak strong (RAC写法)

 
// weak self
#ifndef weakify
#if DEBUG
#if __has_feature(objc_arc)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
#endif
#else
#if __has_feature(objc_arc)
#define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
#endif
#endif
#endif

// strong self
#ifndef strongify
#if DEBUG
#if __has_feature(objc_arc)
#define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
#else
#define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
#endif
#else
#if __has_feature(objc_arc)
#define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
#else
#define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
#endif
#endif
#endif
 
6.去警告

 
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
 
7.GCD Block

 
#define GCDBlock(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
#define GCDMainBlock(block) dispatch_async(dispatch_get_main_queue(),block)
#define CGDMainBack GCDMainBlock(^(){})
 
8……很多很多………

链接查看

相关文章

  • jni-01、宏、jni函数详解、数据获取、类型转换、签名规则

    宏语法 宏定义 解决循环拷贝的问题 T2.h 宏的取消 #undef 宏 宏变量 真实开发中:宏都是大写 宏函数...

  • 宏、参数宏、宏嵌套

    简单宏容易理解,如: 带参数的宏以及宏嵌套: 使用BOOTCMD时就像函数一样使用,方便。如上语句BOOTCMD(...

  • 个人对宏定义命名规范的理解

    1.宏定义的命名规范 通用常量宏 私有常量宏 配置类常量宏 通用操作宏 模板宏 方法简写宏 特定类中的步骤简称 其...

  • iOS高效 宏和常量

    记录一些高效的宏 尺寸 打印宏 NSLog 系统宏 颜色宏 其他宏 参考致谢 link

  • 【C/C++】宏(macro)定义与使用

    文章结构如下: 宏的定义 宏的替换与代码展开 宏的替换产生的问题 获取宏参数名称 宏参数的结合 宏的取消 宏定义的...

  • PPT 批量删除所有备注

    添加宏 打开宏窗口 工具 -> 宏 -> 宏 输入宏名称 例如“删除备注” 点击“+” 添加宏代码 保存,关闭窗口...

  • 模板宏

    声明宏 {% macro 宏的名字(参数) %}​内容{% endmacro %} 调用宏 {{ 宏的名字(参数...

  • iOS 宏(1.位置)

    ios 中的宏 1.宏的位置 问题: 宏可以写在哪里? 解答: 1.1 宏+ Build Settings 宏可...

  • 宏和条件编译的结合使用

    宏 宏定义 有参数 无参数 1.无参数的宏 语法: #define 宏名 宏值 #define MM 10 //...

  • C语言预处理指令

    预处理指令 宏定义 宏定义会在预处理的时候, 用宏定义的值来替换宏的名称 格式: #define 宏名称 宏值 应...

网友评论

      本文标题:

      本文链接:https://www.haomeiwen.com/subject/bjlvaltx.html