main()
{
printf("%s\n",PASTE(15));
#
#define WIDTH 375
#
#elif defined(DOS)
#
#define WIDTH 414
#
#elif defined(OS)
#
#define WIDTH 320
#
#else
#
//#error no sysytem;
#
#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
//設計技巧: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)
#if DEBUG
#define MY_NSLog(fmt,args...) NSLog(@fmt,##args)
#else
#define MY_NSLog(fmt,args...)
#define ZB_HEIGHT_STATUSBAR 20.f // 狀態條高度
#define ZB_HEIGHT_NAVIGATIONBAR44.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
#define ZB_COLOR_HEX(x) ([UIColor colorWithHexColor:(x)])
#define ZB_COLOR(r,g,b) ([UIColor colorWithRed:(r)/255.0green:(g)/255.0blue:(b)/255.0alpha:255/255.0])
#define ZB_COLOR_ALPHA(r,g,b,a) ([UIColor colorWithRed:(r)/255.0green:(g)/255.0blue:(b)/255.0alpha:(a)])
#define ZB_COLOR_RANDOM ([UIColor colorWithRed:arc4random_uniform(256)/255.0green:arc4random_uniform(256)/255.0blue:arc4random_uniform(256)/255.0alpha: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 -開啓異步線程