iOS經常使用宏定義大全

一 基本用法
 1. 宏定義須要加括號的兩種狀況 :
   (1) 若是宏的替換列表中帶有運算符 , 那麼使用要將替換列表放到括號中。例如 #define MAX_VALUE(X,Y) ((X) > (Y) ? (X) : (Y))
   (2)若是宏有參數,每次參數在替換列表中出現時都要放在括號中。同上
#define MAX_VALUE(X,Y) ((X) > (Y) ? (X) : (Y)) // 求兩個數中的最大值

 2.# 運算符和 ## 運算符
 (1) 出如今宏定義中的 # 運算符把跟在其後的參數轉換成一個字符串。有時把這種用法的 # 稱爲字符串化運算符。例如:
 #define PASTE(n) "adhfkj"#n
 main()
 {
 printf("%s\n",PASTE(15));
 }
  宏定義中的 # 運算符告訴預處理程序,把源代碼中任何傳遞給該宏的參數轉換成一個字符串。因此輸出應該是 adhfkj15

針對 Window,dos,os2 不一樣的系統對 WIDTH 進行不一樣的定義
單獨一行的 # 是空指令
#ifdef WINDOWS
#
#define WIDTH
375
#
#elif defined(DOS)
#
#define WIDTH
414
#
#elif defined(OS)
#
#define WIDTH
320
#
#else
#
//#error no sysytem;
#
#endif
 (2)##運算符用於把參數鏈接到一塊兒。預處理程序把出如今##兩側的參數合併成一個符號。看下面的例子:
 #define NUM(a,b,c) a##b##c
 #define STR(a,b,c) a##b##c
 main()
 {
 printf("%d\n",NUM(1,2,3));
 printf("%s\n",STR("aa","bb","cc"));
 }
 
最後程序的輸出爲 :
 123
 aabbcc

#define IMAGE_NAME(NAME) @ "image_name" #NAME  // IMAGE_NAME(3)=image_name3
#define STR(NAME,AGE,SEX) @ " 名字 :" #NAME@ ". 年齡 :" #AGE@ ". 性別 :" #SEX // 名字 :@「 王五 ". 年齡 :24. 性別 :@" "

 3. 取消宏定義
 #undef NUM1

 4. 複雜宏的定義
#define NSLOG_ARRAY_OR_DICT(ARRAY,DICT) (NSLog(@ "array = %@,dict = %@" ,[(ARRAY) description],[(DICT) description]));
// 設計技巧 :dowhile 中出現 ;
#define NSLOG_ARRAY_OR_DICT2(ARRAY,DICT) do {int a = 1 ;NSLog(@ "a = %d" ,a);NSLog(@ "array = %@,dict = %@" ,[(ARRAY) description],[(DICT) description]);}while( 0 )

5. 條件編譯 args... 表示有多個參數
(1) 打印信息
#define DEBUG 1
#if DEBUG
#define MY_NSLog(fmt,args...) NSLog(@fmt ,##args)
#else
#define MY_NSLog(fmt,args...)
#endif


二 經常使用宏定義

ZBConst.h      宏定義文件集合(包含如下宏定義)==>

ZBHttpConst.h  網絡相關宏定義(推薦用const常量代替)
ZBNotificationConst.h 通知相關宏定義(推薦用const常量代替)
ZBDeviceConst.h   系統相關宏定義
ZBStringConst.h     字符串相關宏定義
ZBDefineConst.h     自定義宏




1.系統相關宏定義
/** 1. 設備狀態條 , 導航欄 ,tabbar 高度 */
#define ZB_HEIGHT_STATUSBAR     20.f // 狀態條高度
#define ZB_HEIGHT_NAVIGATIONBAR 44.f // 導航欄高度
#define ZB_HEIGHT_TABBAR        49.f // tabbar 高度

/** 2. 設備屏幕寬度和高度 ( 支持橫屏 ) */
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 // 當前 Xcode 支持 iOS8 及以上
#define ZB_SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.width)
#define ZB_SCREEN_HEIGHT ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.height)
#define ZB_SCREEN_SIZE ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?CGSizeMake([UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale,[UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale):[UIScreen mainScreen].bounds.size)
#else
#define ZB_SCREEN_WIDTH     [UIScreen mainScreen].bounds.size.width
#define ZB_SCREEN_HEIGHT    [UIScreen mainScreen].bounds.size.height
#define ZB_SCREEN_SIZE      [UIScreen mainScreen].bounds.size
#endif

/**
 *  3.
設備類型
 * 
設備屏幕高度 :IPHONE4(iPhone4,iPhone4s)480;IPHONE5(iPhone5,iPhone5s)568;IPHONE6 667;IPHONE6PLUS 736.
 *  EPSILON
是最小偏差 ,DBL_EPSILON 是雙浮點型 (double) 最小偏差 , EPSILON+X 不等於 X 的最小的正數
 */

#if TARGET_IPHONE_SIMULATOR // 模擬器
#define IPHONE4             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double ) 480 ) < DBL_EPSILON )
#define IPHONE5             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
568 ) < DBL_EPSILON )
#define IPHONE6             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
667 ) < DBL_EPSILON )
#define IPHONE6PLUS         ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
736 ) < DBL_EPSILON )
#elif TARGET_OS_IPHONE
// 真機
#define IPHONE4             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double ) 480 ) < DBL_EPSILON )
#define IPHONE5             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
568 ) < DBL_EPSILON )
#define IPHONE6             ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
667 ) < DBL_EPSILON )
#define IPHONE6PLUS         ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )
736 ) < DBL_EPSILON )
#endif
// 判斷是否爲 iPhone
#define ZB_IS_IPHONE           (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
// 判斷是否爲 iPad
#define ZB_IS_IPAD             (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
// 判斷是否爲 ipod
#define ZB_IS_IPOD             ([[[UIDevice currentDevice] model] isEqualToString:@ "iPod touch" ])


/**
 *  4.
設備系統版本
 */

#define iOS6_LATER          ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0 )
#define iOS7_LATER          ([[UIDevice currentDevice].systemVersion floatValue] >=
7.0 )
#define iOS8_LATER          ([[UIDevice currentDevice].systemVersion floatValue] >=
8.0 )
#define iOS9_LATER          ([[UIDevice currentDevice].systemVersion floatValue] >=
9.0 )
#define iOS7_0              ([[UIDevice currentDevice].systemVersion floatValue] ==
7.0 )
#define iOS7_1              ([[UIDevice currentDevice].systemVersion floatValue] ==
7.1 )
#define iOS8_0              ([[UIDevice currentDevice].systemVersion floatValue] ==
8.0 )
#define iOS8_1              ([[UIDevice currentDevice].systemVersion floatValue] ==
8.1 )
#define iOS8_2              ([[UIDevice currentDevice].systemVersion floatValue] ==
8.2 )
#define iOS8_3              ([[UIDevice currentDevice].systemVersion floatValue] ==
8.3 )
#define iOS9_0              ([[UIDevice currentDevice].systemVersion floatValue] ==
9.0 )
#define iOS9_1              ([[UIDevice currentDevice].systemVersion floatValue] ==
7.1 )

/** 5. 獲取 temp, 沙盒 Document, 沙盒 Cache 目錄 */
#define ZB_PATH_TEMP        NSTemporaryDirectory()
#define ZB_PATH_DOCUMENT    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
#define ZB_PATH_CACHE       [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]

/** 6.ARC/MRC */
#if __has_feature(objc_arc)
// ARC
#else
// MRC
#endif

2.自定義宏

/** 1. 顏色字體 */
#define ZB_COLOR_HEX(x)              ([UIColor colorWithHexColor:(x)])
#define ZB_COLOR(r,g,b)              ([UIColor colorWithRed:(r)/
255.0 green:(g)/ 255.0 blue:(b)/ 255.0 alpha: 255 / 255.0 ])
#define ZB_COLOR_ALPHA(r,g,b,a)      ([UIColor colorWithRed:(r)/
255.0 green:(g)/ 255.0 blue:(b)/ 255.0 alpha:(a)])
#define ZB_COLOR_RANDOM              ([UIColor colorWithRed:arc4random_uniform(
256 )/ 255.0 green:arc4random_uniform( 256 )/ 255.0 blue:arc4random_uniform( 256 )/ 255.0 alpha: 1.0 ])
#define ZB_FONT(x)                   ([UIFont systemFontOfSize:(x)])

/** 2. 空值判斷 */
#define ZB_IS_EMPTY_STR(_str)        (((_str) == nil) || ([(_str) isEqual:[NSNull null]]) ||([(_str)isEqualToString:@ "" ]))
#define ZB_IS_EMPTY_ARR(_arr)        (((_arr) == nil) || ([(_arr) isEqual:[NSNull null]]) ||([(_arr) count] ==
0 ))

/** 3. 單例 */
// 聲明單例
#undef  ZB_SINGLETON_DEFINE
#define ZB_SINGLETON_DEFINE( __class ) \
+ (__class *)sharedInstance;
// 實現單例
#undef  ZB_SINGLETON_IMPLEMENT
#define ZB_SINGLETON_IMPLEMENT( __class ) \
+ (__class *)sharedInstance \
{ \
static __class * __singleton__ = nil; \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
__singleton__ = [[__class alloc] init]; \
}); \
return __singleton__; \
}

/** 4. 打印日誌 */
#ifdef DEBUG
#define ZBLog(...)  NSLog(__VA_ARGS__)
#define ZB_LOG_INT(N) NSLog(@
"%d" ,(N))
#define ZB_LOG_FLOAT(F) NSLog(@
"%f" ,(F))
#define ZB_LOG_INTEGER(I) NSLog(@
"%ld" ,(long)(I))
#else
#define ZBLog(...)
#define ZB_LOG_INT(N)
#define ZB_LOG_FLOAT(F)
#define ZB_LOG_INTEGER(I)
#endif

/** 5.weakself/strongself */
#define ZB_WEAK_SELF(type)  __weak typeof(type) weak##type = type;
#define ZB_STRONG_SELF(type)  __strong typeof(weak##type) strong##type = weak##type;

/** 6.GCD */
// GCD - 一次性執行
#define ZB_DISPATCH_ONCE_BLOCK(onceBlock) static dispatch_once_t onceToken; dispatch_once(&onceToken, onceBlock);
// GCD - Main 線程上運行
#define ZB_DISPATCH_MAIN_THREAD(mainQueueBlock) dispatch_async(dispatch_get_main_queue(), mainQueueBlock);
// GCD - 開啓異步線程
#define ZB_DISPATCH_GLOBAL_QUEUE_DEFAULT(globalQueueBlock) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), globalQueueBlock);
相關文章
相關標籤/搜索