iOS開發技巧(系列六-再談#define和預編譯指令)

以前寫過一篇博客,iOS深刻學習:華麗的#define,列出了一些經常使用的#define。ios

今天再總結一點#define和預處理指令的使用。ide

預處理過程掃描源代碼,對其進行初步的轉換,產生新的源代碼提供給編譯器。可見預處理過程先於編譯器對源代碼進行處理
學習

預處理指令是以#開頭的代碼行,#後是指令關鍵字,在關鍵字和#號之間容許存在任意個數的空白字符。正行語句構成了一條預處理指令,該指令醬紫啊編譯器進行編譯以前對源代碼作某些轉換,下面是一些經常使用的預處理指令,
spa

#    空指令,沒有任何效果
.net

#include 包含一個源代碼文件orm

#define 定義宏對象

#undef 取消定義宏blog

#if 若是條件爲真,則編譯下面的代碼
get

#elif 若是前面的#if不爲真,則編譯下面的代碼編譯器

#endif 結束一個#if...#elif條件編譯塊

#ifdef 若是已經定義了某個宏,則編譯下面的代碼

#ifndef 若是沒有定義某個宏,則編譯下面的代碼

#error 中止編譯並顯示錯誤信息


最近在看公司本身封裝的sdk的時候,遇到了不少#ifdef和#ifndef,下面我就主要距離來講一說這個預處理指令的靈活使用。好比你如今經過代碼建立了一個Button,

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        btn.frame = CGRectMake(0, 0, 100, 40);

        [btn setTitle:@"BUTTON" forState:UIControlStateNormal];

        [btn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:btn];

可是根據新的需求,這個Button暫時不須要顯示在界面上面,這時候不能夠將該Button相關的代碼註釋掉,這也不失爲一個好方法。可是我更推薦使用預處理指令來進行條件判斷,下面我使用兩種方法來講明,

(1)第一種方法,定義一個具體的宏

#define Debug_ShowButton 0

{

    //建立Button對象btn

    ......//省略若干代碼

#if Debut_ShowButton

    //若是須要顯示按鈕,那麼將其添加到父視圖中

    [self.view addSubview:btn];

#else

    //不將其添加到父視圖中

    //[self.view addSubview:btn];

#endif

}

這時候若是想顯示該Button對象,那麼將#define Debug_ShowButton 1,不然寫爲#define Debug_ShowButton 0。

(2)第二種方法,定義一個沒有數值的宏

{

#ifdef Debug_ShowButton

    [self.view addSubview:btn];

#endif

}

這段代碼的意思就是若是定義了宏Debug_ShowButton,那麼就將btn添加到父視圖,若是沒有定義的話,那麼不添加到父視圖。這時候若是咱們想要將其添加到父視圖,則在文件的頂部寫上#define Debug_ShowButton,對,這時候咱們能夠不給這個宏指定對應的值,這個代碼僅僅表示定義一個沒有對應值的宏。

總結:

這兩種方法,我更加推薦第二種,由於通常狀況下,咱們定義一個有對應數值的宏,是爲了在代碼中使用該數值,例如#define kStatusBarHieght 20,這樣咱們就能夠把kStatusBarHeight做爲數值在代碼中使用,而第一種方法定義了有對應值的宏Debug_ShowButton,咱們卻沒有在代碼中使用它,這樣是否是有點浪費呢;而使用第二種方法定義一個沒有對應值的宏,它只是一個標識符,看起來簡單點。我我的更加推薦第二種!


本人建了一個ios交流羣188647173,有興趣的能夠加羣進來相互交流。

相關文章
相關標籤/搜索