一、判斷當前設備是否是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
經過上面簡單的說明,相信能夠有點了解了吧。