//获取屏幕 宽度、高度
#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)
#define SCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height)
// 根据版本号导入文件
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
/**
* 版本号
*
* @param CFBundleShortVersionString
*
* @return kVersion
*/
#define kVersion [NSString stringWithFormat:@"%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]]
/**
* iPhone or iPad
*/
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_PAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IPHONE4S ((SCREEN.height == 480.0f)?YES:NO)
#define IPHONE5 ((SCREEN.height == 568.0f)?YES:NO)
#define IPHONE6 ((SCREEN.height == 667.0f)?YES:NO)
#define IPHONE6P ((SCREEN.height == 736.0f)?YES:NO)
// 操作系统宏
#define IOS10_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0)
#define IOS9_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0)
#define IOS8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
#define IOS7_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
// 线程开启宏 #define dispatch_main_async_withsafe(block)\ if ([NSThread isMainThread]) {\ block();\ } else {\ dispatch_async(dispatch_get_main_queue(), block);\ } #define dispatch_global_async_withsafe(block)\ if ([NSThread isMainThread]) {\ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),block);\ } else {\ block();\ }
单粒模式宏定义
#pragma mark - 实例定义
#define SingletenInterface \
+ (instancetype)sharedInstance;\
#pragma mark - 定义单例代码块
#define SingletenImpl \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
} \
\
+ (instancetype)sharedInstance \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
宏中使用##,传入参数作为shared方法名称:
//
// Singleten.h
// 可变参数测试
//
// Created by HJiang on 2017/9/1.
// Copyright © 2017年 HJiang. All rights reserved.
//
#ifndef Singleten_h
#define Singleten_h
#pragma mark - 实例定义
#define SingletenInterface(name) \
+ (instancetype)shared##name;\
#pragma mark - 定义单例代码块
#define SingletenImpl(name) \
static id _instace; \
\
+ (id)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [super allocWithZone:zone]; \
}); \
return _instace; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return _instace; \
} \
\
+ (instancetype)shared##name \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instace = [[self alloc] init]; \
}); \
return _instace; \
} \
\
#endif /* Singleten_h */
定义开发模式和发布模式条件宏
#ifdef DEBUG
#define CCDebugLog(fmt,...) \
if ([[NSThread currentThread] isMainThread]) {\
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\
NSString *newFrt = [@"[文件名:%s]\n [函数名:%s]\n [行号:%d]\n" stringByAppendingString:fmt ];\
NSString *logContent = [NSString stringWithFormat:newFrt,__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__];\
logContent = [NSString stringWithFormat:@"%@%@%@",@"#####",logContent,@"#####"];\
NSLog(@"%@",logContent);\
});\
}else{\
NSString *newFrt = [@"[文件名:%s]\n [函数名:%s]\n [行号:%d]\n" stringByAppendingString:fmt ];\
NSString *logContent = [NSString stringWithFormat:newFrt,__FILE__, __FUNCTION__, __LINE__,##__VA_ARGS__];\
logContent = [NSString stringWithFormat:@"%@%@%@",@"#####",logContent,@"#####"];\
NSLog(@"%@",logContent);\
}\
#else
#define CCDebugLog(fmt,...)
# endif
替换系统NSLog
#ifdef DEBUG
#define NSLog(format, ...) printf("\n[%s] %s [第%d行] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);
#else
#define NSLog(format, ...)
#endif