//-----------------------------------------------------------
//#pragma mark - 系统相关
#define USER_DEFAULT [NSUserDefaults standardUserDefaults]
#define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter]
#define CURRENT_LANGUAGE [[NSLocale preferredLanguages] objectAtIndex:0]
//-----------------------------------------------------------
#pragma mark - 系统版本判断
#define SYS_VER [[UIDevice currentDevice] systemVersion]
#define SYS_VER_FLOAT [SYS_VER floatValue]
#define IOS8_OR_LATER (SYS_VER_FLOAT >= 8.0f)
#define IOS9_OR_LATER (SYS_VER_FLOAT >= 9.0f)
#define IOS10_OR_LATER (SYS_VER_FLOAT >= 10.0f)
#define VERSION_EQUAL_TO(v1,v2) \
([v1 compare:v2 options:NSNumericSearch] == NSOrderedSame)
#define VERSION_GREATER_THAN(v1,v2) \
([v1 compare:v2 options:NSNumericSearch] == NSOrderedDescending)
#define VERSION_GREATER_THAN_OR_EQUAL_TO(v1,v2) \
([v1 compare:v2 options:NSNumericSearch] != NSOrderedAscending)
#define VERSION_LESS_THAN(v1,v2) \
([v1 compare:v2 options:NSNumericSearch] == NSOrderedAscending)
#define VERSION_LESS_THAN_OR_EQUAL_TO(v1,v2) \
([v1 compare:v2 options:NSNumericSearch] != NSOrderedDescending)
#define SYSTEM_VERSION_EQUAL_TO(v) VERSION_EQUAL_TO(SYS_VER,v)
#define SYSTEM_VERSION_GREATER_THAN(v) VERSION_GREATER_THAN(SYS_VER,v)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) VERSION_GREATER_THAN_OR_EQUAL_TO(SYS_VER,v)
#define SYSTEM_VERSION_LESS_THAN(v) VERSION_LESS_THAN(SYS_VER,v)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) VERSION_LESS_THAN_OR_EQUAL_TO(SYS_VER,v)
#define APP_VERSION [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]
//-----------------------------------------------------------
#pragma mark - GCD线程相关
#define GCD_ONCE(block) static dispatch_once_t onceToken; dispatch_once(&onceToken, block);
#define GCD_GLOBAL(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block);
#define GCD_MAIN(block) if([[NSThread currentThread] isMainThread]){block();}else{dispatch_async(dispatch_get_main_queue(),block);}
#define GCD_DELAY(sec,block) dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(sec * NSEC_PER_SEC)), dispatch_get_main_queue(), block);
//-----------------------------------------------------------
#pragma mark - 为空判断相关
///是否为nil或NSNull
#define NOT_NIL_AND_NULL(_ref) (((_ref) != nil) && (![(_ref) isKindOfClass:[NSNull class]]))
#define IS_NIL_OR_NULL(_ref) (((_ref) == nil) || ([(_ref) isKindOfClass:[NSNull class]]))
///字符串
#define IS_STR_EMPTY(_ref) (IS_NIL_OR_NULL(_ref) || ([(_ref) length] == 0))
#define NSSTRING_NOT_NIL(_ref) IS_NIL_OR_NULL(_ref) ? @"" : _ref
///数组
#define IS_ARRAY_EMPTY(_ref) (IS_NIL_OR_NULL(_ref) ||([(_ref) count] == 0))
//-----------------------------------------------------------
#pragma mark - 类型数据生成相关
///便捷方式创建NSNumber类型
#define NUMBER_INT( __x ) [NSNumber numberWithInt:(NSInteger)__x]
#define NUMBER_UINT( __x ) [NSNumber numberWithUnsignedInt:(NSUInteger)__x]
#define NUMBER_FLOAT( __x ) [NSNumber numberWithFloat:(float)__x]
#define NUMBER_DOUBLE( __x ) [NSNumber numberWithDouble:(double)__x]
//读取本地文件
#define PATH(file,ext) [[NSBundle mainBundle]pathForResource:file ofType:ext]
#define LOAD_IMAGE(file,ext) [UIImage imageWithContentsOfFile:PATH(file,ext)]
//Color
#define RGBCOLOR(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]
#define RGBACOLOR(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]
#define HEXCOLOR(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
#define HEXCOLORALPHA(rgbValue,_alpha) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:_alpha]
#define CLEARCOLOR [UIColor clearColor]
#define RANDOMCOLOR [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]
//-----------------------------------------------------------
#pragma mark - 解决循环应用相关
#define Weak(var, weakVar) __weak __typeof(&*var) weakVar = var
#define Strong_DoNotCheckNil(weakVar, _var) __typeof(&*weakVar) _var = weakVar
#define Strong(weakVar, _var) Strong_DoNotCheckNil(weakVar, _var); if (!_var) return;
#define Weak_(var) Weak(var, weak_##var);
#define Strong_(var) Strong(weak_##var, _##var);
#define WeakSelf Weak(self, weakSelf);
#define StrongSelf Strong(weakSelf, strongSelf);