天天看点

iOS几种宏定义

  1. 不带参数
//获取底部安全区域高度(主要针对iPhoneX等设备)
//safeAreaInsets 该方法iOS 11之后新加入的接口
#define BottomSaveHeight [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.bottom
           
  1. 带参数
// 弱引用自身 block中调用自身需要弱引用避免循环引用
#define Weakself(weakSelf) __weak typeof(&*self) weakSelf = self;
// LLVM老版编译器typeof(self)会报错,所以这样处理 typeof(&*self),现在不会了
#define Weakself(weakSelf) __weak typeof(self) weakSelf = self;
           
======================== 更新于2019年3月4日 ========================
// weak引用 ##的作用就是把2个宏参数连接为1个数
#define JJWeakSelfType(type)  __weak typeof(type) weak##type = type;
例:
JJWeakSelfType(self)
            [vc block:^(NSString * _Nullable string) {
                weakself.string = string;
            }];
/** strong引用 */
#define JJStrongSelfType(type)  __strong typeof(type) strong##type = type;
==================================================================
           
  1. 函数式:通过一个函数做运算,返回运算结果
#define BottomSaveHeight [[[UIApplication sharedApplication] delegate] window].safeAreaInsets.bottom
// 底部定义一个50高度的view,
// 如果是iPhoneX的话底部安全区没有遮挡,可能显示不太友好,
// view高度加上安全区高度,遮挡住安全区
// safeAreaInsets 该方法iOS 11之后新加入的接口,所以要做判断处理
#define BottomViewHeight \
({CGFloat h = 50;\
    if (@available(iOS 11.0, *)) {\
        h = (BottomSaveHeight + 50);\
    }\
(h);})
           
  1. block式:带block的参数
// SDWebImage中主线程安全调用的一个宏
#define dispatch_main_async_safe(block)\
if ([NSThread isMainThread]) {\
	block();\
} else {\
	dispatch_async(dispatch_get_main_queue(), block);\
}
           

宏定义可以优化开发效率,之后会不定期更新本文,来记录自己开发中经常用到的一些宏定义。

// 获取屏幕宽度
#define kScreenWidth    [[UIScreen mainScreen] bounds].size.width

// 获取屏幕高度
#define kScreenHeight   [[UIScreen mainScreen] bounds].size.height

// 获取状态栏高度,iPhoneX之前手机状态栏高度为20,iPhoneX为40,这个宏定义动态获取状态栏高度
#define kStatusBarHeight [[UIApplication sharedApplication] statusBarFrame].size.height

// Debug 模式调试打印数据
#ifdef DEBUG
#define LRString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
#define LRLog(...) printf("%s 第%d行: %s\n\n", [LRString UTF8String] ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
#else
#define LRLog(...)
#endif

// 系统沙盒文件路径(NSString) 
#define kDocumentPath   [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]

// 系统沙盒文件路径(NSURL) 
#define kDocumentURL    [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]

// 系统缓存路径
#define kCachePath      (NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0])

// 获取手机当前设置的地区
#define CURR_LANG ([[NSLocale preferredLanguages] objectAtIndex:0])

// 当前设备是iPad
#define INTERFACE_IS_PAD     ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
// 当前设备是iPhone
#define INTERFACE_IS_PHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)

// 颜色(RGB)
#define RGBCOLOR(r, g, b)       [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]
#define RGBACOLOR(r, g, b, a)   [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:(a)]

// RGB颜色转换(16进制->10进制)UIColor *color = UIColorFromRGB(0x9b9b9b);
#define UIColorFromRGB(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 UIColorWhite(white, alpha) [UIColor colorWithWhite:white alpha:alpha]
           
// 灰色度
#define UIColorWhite(w, a) [UIColor colorWithWhite:w alpha:a]