# iOS常用宏定义

&#x20;原文地址：<http://www.jianshu.com/p/56b1a8bd092c>

* 判断字符串是否为空

  ```
  #define kStringIsEmpty(str) ([str isKindOfClass:[NSNull class]] || str == nil || [str length] < 1 ? YES : NO )
  ```
* 数组是否为空

  ```
  #define kArrayIsEmpty(array) (array == nil || [array isKindOfClass:[NSNull class]] || array.count == 0)
  ```
* 字典是否为空

  ```
  #define kDictIsEmpty(dic) (dic == nil || [dic isKindOfClass:[NSNull class]] || dic.allKeys == 0)
  ```
* 是否为空对象

  ```
  #define kObjectIsEmpty(_object) (_object == nil \  || [_object isKindOfClass:[NSNull class]] \  || ([_object respondsToSelector:@selector(length)] && [(NSData *)_object length] == 0) \  || ([_object respondsToSelector:@selector(count)] && [(NSArray *)_object count] == 0))
  ```
* 获取屏幕宽度

  ```
  #define kScreenWidth \
   ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.width) 
  #define kScreenHeight \
   ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)] ? [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale : [UIScreen mainScreen].bounds.size.height) 
  #define kScreenSize \  
  ([[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)
  ```
* 常用的缩写

  ```
  #define kApplication        [UIApplication sharedApplication]  
  #define kKeyWindow          [UIApplication sharedApplication].keyWindow  
  #define kAppDelegate        [UIApplication sharedApplication].delegate  
  #define kUserDefaults      [NSUserDefaults standardUserDefaults]  
  #define kNotificationCenter [NSNotificationCenter defaultCenter]
  ```
* APP版本号

  ```
  #define kAppVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]
  ```
* 获取当前语言

  ```
  #define kCurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0])
  ```
* 获取系统版本

  ```
  #define IOS_VERSION ［[UIDevice currentDevice] systemVersion] floatValue]  
  #define CurrentSystemVersion ［UIDevice currentDevice] systemVersion]
  ```
* 判断是否为iPhone

  ```
  #define kISiPhone (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
  ```
* 判断是否为ipad

  ```
  #define kISiPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  ```
* 获取沙盒Document路径

  ```
  #define kDocumentPath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]
  ```
* 获取沙盒Cache路径

  ```
  #define kCachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]
  ```
* 开发的时候打印，但是发布的时候不打印的NSLog

  ```
  #ifdef DEBUG 
   #define NSLog(...) NSLog(@"%s 第%d行 \n %@\n\n",__func__,__LINE__,[NSString     stringWithFormat:__VA_ARGS__])  
   #else   #define NSLog(...)   
   #endif
  ```
* 颜色

  ```
  #define kRGBColor(r, g, b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]  

  #define kRGBAColor(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(r)/255.0 blue:(r)/255.0 alpha:a]  

  #define kRandomColor    KRGBColor(arc4random_uniform(256)/255.0,arc4random_uniform(256)/255.0,arc4random_uniform(256)/255.0)        //随机色生成 

   #define kColorWithHex(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 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 RGBA(r,g,b,a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]
   #define RGB(r,g,b) RGBA(r,g,b,1.0f)
  ```
* 弱引用/强引用

  ```
  #define kWeakSelf(type)  __weak typeof(type) weak##type = type; 
  #define kStrongSelf(type) __strong typeof(type) type = weak##type;
  ```
* 角度转变成弧度

  ```
  #define kRadianToDegrees(radian) (radian * 180.0) / (M_PI)
  ```
* 由弧度获取角度

  ```
  #define radianToDegrees(radian) (radian*180.0)/(M_PI)
  ```
* 获取一段时间间隔

  ```
  #define kStartTime CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); 
  #define kEndTime  NSLog(@"Time: %f", CFAbsoluteTimeGetCurrent() - start)
  ```
* 判断是否 Retina屏、设备是否为iPone 5、是否是iPad

```
 #define isRetina ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 960), ［UIScreen mainScreen] currentMode].size) : NO)

#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), ［UIScreen mainScreen] currentMode].size) : NO)  #define isPad (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
```

* 比较系统版本

```
  #define SYSTEM_VERSION_EQUAL_TO(v) (［[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

  #define SYSTEM_VERSION_GREATER_THAN(v) (［[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

  #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) (［[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

  #define SYSTEM_VERSION_LESS_THAN(v) (［[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) (［[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)
```

* 设置view的tag

  ```
  #define VIEWWITHTAG(_OBJECT, _TAG)    [_OBJECT viewWithTag : _TAG]
  ```
* 程序的本地化,引用国际化的文件

  ```
  #define MyLocal(x, ...) NSLocalizedString(x, nil)
  ```
* G-C-D

  ```
  #define BACK(block) dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)  

  #define MAIN(block) dispatch_async(dispatch_get_main_queue(),block)
  ```
* 单例化一个类

  ```
  #define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \  \  static classname *shared##classname = nil; \  \  + (classname *)shared##classname \  { \  @synchronized(self) \  { \  if (shared##classname == nil) \  { \  shared##classname = ［self alloc] init]; \  } \  } \  \  return shared##classname; \  } \  \  + (id)allocWithZone:(NSZone *)zone \  { \  @synchronized(self) \  { \  if (shared##classname == nil) \  { \  shared##classname = [super allocWithZone:zone]; \  return shared##classname; \  } \  } \  \  return nil; \  } \  \  - (id)copyWithZone:(NSZone *)zone \  { \  return self; \  }  #endif
  ```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://philm.gitbook.io/philm-ios-wiki/mei-zhou-yue-du/ios-chang-yong-hong-ding-yi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
