一、判断当前设备是否是iOS7以上版本spa
#define IOS_VERSION_7_OR_ABOVE (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)? (YES):(NO))指针
若是判断系统的设备在项目中使用频繁,那么就将这个宏在.pch文件中定义,这样就能够在整个项目中使用这个宏。code
使用的时候最好是用if-elseorm
if(IOS_VERSION_7_OR_LATER)开发
{字符串
NSLog(@"iOS7 or Later");
it
}io
else编译
{变量
NSLog(@"Version before iOS7");
}
若是使用#if-#else-#endif,此时是会报错的,
#if IOS_VERSION_7_OR_LATER
//这是iOS7或更高版本
#else
//这是iOS7以前的版本
#endif
为何会有错误呢,由于iOS项目在判断系统版本的宏IOS_VERSION_7_OR_ABOVE的语法是动态的,也就是在运行时判断的,这回根据你运行真机的不一样系统得出不一样的值;而#if-#else-#endif判断语句中是静态编译的,就是里面的语句在Xcode编译的时候就要肯定无误的,而如今的判断条件IOS_VERSION_7_OR_ABOVE是运行时候才能知道的确切数值,运行时是在编译的后面的过程,这时候就产生了矛盾,Xcode报错。打个比方来讲,你想买个100块钱的篮球,if-else就是能够支持信用卡消费,你如今没钱,能够先买了,等到你赚了钱再还,赚了钱这个时刻类比就是运行时判断了系统的版本;而#if-#else-#endif只支持现金消费,它只要求你如今有钱,若是如今没钱,对不起,这个篮球不卖。
二、typedef和#define的区别
(1)typedef是类型定义,它是语言编译过程中的一部分,咱们在iOS开发过程当中常常将typedef和枚举enum一块儿使用,好比下面的代码,
typedef enum _OperateType{
InsertOperateType = 0,
UpdateOperateType,
DeleteOperateType,
}OperateType;
这时候OperateType就是一个数据类型,该类型的变量只能是InsertOperateType、UpdateOperateType和DeleteOperateType三种数值。
(2)#define本质上就是文本替换,它自己并不在编译过程当中执行,而是在以前(预处理过程)就已经完成了。
二者的区别:
宏定义只是简单的字符串替换(原地扩展),而typedef则不是原地扩展,它的新名字具备必定的封装新,因此新命名的标识符具备定义变量的功能,看下面的代码以及讲解,
typedef (int *) pINT1;
#define pINT2 int*;
使用pINT一、pINT2来定义变量
pINT1 a,b;--等价于-- int *a;int *b;表示定义了两个指向整型变量的指针a和b
pINT2 a,b;--等价于-- int *a,b;表示定义了一个指针变量a,一个整型变量b
经过上面简单的说明,相信能够有点了解了吧。