一 基本用法
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);