首先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")
比如項(xiàng)目中切換環(huán)境的宏
1.可以先定義要用到的環(huán)境
#define XHW_OPENPRODUCT          0     
#define XHW_OPENPRODUCTEX        0      
#define XHW_OPENUAT              1    
#define XHW_OPENINNER            0    
#define XHW_OPENRET              0    

創(chuàng)建一個(gè)網(wǎng)絡(luò)類處理網(wǎng)絡(luò)情況
typedef NS_ENUM(NSInteger,XHWNetWorkServiceType) {
    XHWNetworkTypePRODUCT,          
    XHWNetworkTypePRODUCTEX,        
    XHWNetworkTypeUAT,             
    XHWNetworkTypeINNER,            
    XHWNetworkTypeRET,              
};
項(xiàng)目全局只使用這里拿到的網(wǎng)絡(luò)環(huán)境做相應(yīng)的配置
+(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  定義一個(gè)預(yù)處理宏
#undef   取消宏的定義
#if      編譯預(yù)處理中的條件命令, 相當(dāng)于C語法中的if語句
#ifdef   判斷某個(gè)宏是否被定義(#define過), 若已定義, 執(zhí)行隨后的語句
#ifndef  與#ifdef相反, 判斷某個(gè)宏是否未被定義
#elif    若#if, #ifdef, #ifndef或前面的#elif條件不滿足, 則執(zhí)行#elif之后的語句, 相當(dāng)于C語法中的else-if
#else    與#if, #ifdef, #ifndef對(duì)應(yīng), 若這些條件不滿足, 則執(zhí)行#else之后的語句, 相當(dāng)于C語法中的else
#endif   #if, #ifdef, #ifndef這些條件命令的結(jié)束標(biāo)志.
defined   與#if, #elif配合使用, 判斷某個(gè)宏是否被定義
#pragma  說明編譯器信息
#warning 顯示編譯警告信息
#error   顯示編譯錯(cuò)誤信息
 
配置DEBUG宏:
 
1.在 "Target > Build Settings > Preprocessor Macros > Debug" 設(shè)置"DEBUG=1”。

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

#ifdef DEBUG // 調(diào)試狀態(tài), 打開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 // 發(fā)布狀態(tài), 關(guān)閉LOG功能
#define SFLog(s, ...)
#endif

系統(tǒng)宏介紹:

 __LINE__:宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)

 __FUNCTION__:宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱

__VA_ARGS__:簡單的說,就是將左邊…的內(nèi)容替換進(jìn)來
 
#####詳解#ifdef,#elif,#else,#endif,#if等:

 
1:
  #ifdef _XXXX  (ifdef 即 if define )
  ...程序段1...
   #elif defined _YYYY
   ...程序段3...(相當(dāng)于else if)
  #else
  ...程序段2...
  #endif
   
>這表明如果_XXXX已被#define定義過,則對(duì)程序段1進(jìn)行編譯;再如果定義了_YYYY,執(zhí)行程序段3,否則對(duì)程序段2進(jìn)行編譯。

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

  #ifdef NUM
   printf("之前NUM有過定義啦!:) \n");
  #else
   printf("之前NUM沒有過定義!:( \n");
  #endif

>如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時(shí)候,當(dāng)然執(zhí)行第一個(gè)printf。否則第二個(gè)printf將被執(zhí)行。
   我認(rèn)為,用這種,可以很方便的開啟/關(guān)閉整個(gè)程序的某項(xiàng)特定功能。
 
2: 
  #ifndef _XXXX 
  ...程序段1... 
  #else 
  ...程序段2... 
  #endif

>這里使用了#ifndef,表示的是if not def。和#ifdef相反的狀況(如果沒有定義了標(biāo)識(shí)符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)
 
3:
  #if 常量 
  ...程序段1...
  #else
  ...程序段2...
  #endif 
  
 >注意:#if后必須跟常量,不能是宏(因?yàn)楹晔窃谶\(yùn)行階段才有,#if是預(yù)編譯階段,找不到宏);
  如果常量為真(非0,隨便什么數(shù)字,只要不是0),就執(zhí)行程序段1,否則執(zhí)行程序段2。
 我認(rèn)為,這種方法可以將測試代碼加進(jìn)來。當(dāng)需要開啟測試的時(shí)候,只要將常量變1就好了。而不要測試的時(shí)候,只要將常量變0。
 
常用示例:
 
1.判斷當(dāng)前app所支持的最大最小iOS版本

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

#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED // 當(dāng)前軟件支持的最小ios版本
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80400
      NSLog(@"當(dāng)前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#else
     NSLog(@"當(dāng)前app支持的最小版本,%d",__IPHONE_OS_VERSION_MIN_REQUIRED);
#endif
#endif
 
2.判斷真機(jī)/模擬器

 
#if TARGET_OS_IOS
    NSLog(@"真機(jī)測試");
#endif

#if TARGET_IPHONE_SIMULATOR
    NSLog(@"模擬器");
#endif
 
3.獲得當(dāng)前設(shè)備的iOS版本 

 
#define kIOSVersion  [[UIDevice currentDevice].systemVersion doubleValue]
 
4.字體(帶參數(shù)的宏)

 
#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……很多很多………

鏈接查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容