iPhone應用根據Debug和Release狀態變化來屏蔽日誌輸出是我們要介紹的內容,我們平時在開發應用的時候,經常會用到 NSLog 來調試我們的程式,而隨著項目越來越大,這些用於調試的日誌輸出就會變得很難管理。 發布正式版的時候一定要屏蔽掉所有後台輸出,因為這些輸出還是比較消耗系統資源的。 往往到了這個時候,我們不得不去一行一行的找到 NSLog 調用,然後注釋掉。
這樣做在項目小的時候還比較有效,但隨著項目規模的增長,就會變得越來越難控制。 下面就給大家介紹一個簡單的方法,讓我們在產生 Release 版本時不需要進行任何更改即可屏蔽所有的日誌輸出。
首先我們先要定義這樣一段預先處理命令,檔案名稱隨便起,例如 CLog.h
- #ifdef DEBUG
- #define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
- #else
- #define CLog(format, ...)
- #endif
這裡我們判斷 DEBUG 這個宏是否定義,如果有定義我們就將這個 CLog 宏替換成 NSLog 調用,而如果沒有定義過 DEBUG 標誌我們就直接跳過。這點應該不難理解。
檢查 DEBUG 標誌是否正確定義,Xcode 一般會在 debug 回合組態項裡面已經定義號了DEBUG 標誌,如果沒定義我們就自己寫上,以我的 Xcode 4 為例,如:
找到 PreProcessor Macros 這個屬性,對於 Debug 配置我們給他寫上 DEBUG,而在 Release 配置中把它留空。 這樣我們剛才那段預先處理命令就可以根據這個標誌來判斷我們編譯的時調試版本還是發布版本,從而控制 NSLog 的輸出。 (因為 Xcode 4 會把 debug/release 兩個配置項同時對比展現出來,而 3.x 版本的只能分別設定,如果你用的時xcode 3.x 開發工具, 那麼就分別對 Debug/Release 都檢查一下)。
到了這裡我們這個判斷工作就都進行完了,不過這裡還有一點比較麻煩,就是我們如果想實用 CLog 宏,就必須要匯入 CLog.h 這個標頭檔。 不過 Xcode 為我們提供了一種非常巧妙的解決辦法。 我們自己看一下項目裡的檔案,是不是有一個叫做 xxx-prefix.pch 的檔案,只要注意到 pch 這個副檔名就可以了。 這個檔案是做什麼用的呢? 下面是一個 pch 檔案的樣本:
- //
- // Prefix header for all source files
- //
- #import <Availability.h>
- #ifndef __IPHONE_3_0
- #warning "This project uses features only available in iPhone SDK 3.0 and later."
- #endif
- #ifdef __OBJC__
- #import <UIKit/UIKit.h>
- #import <Foundation/Foundation.h>
- #endif
這裡引入了一些標頭檔, 其實是 Xcode 的一種先行編譯機制,我們在編譯一個項目的時候,會有很多常用的源檔案,並且這些代碼檔案幾乎不被修改,所以 Xcode 對這些檔案只在早期進行一次編譯,以便我們以後的多次構建過程中反覆實用。 例如這裡的 UIKit 和 Foundation ,這樣的機制可以加快我們每次構建項目的速度。
當然這裡我們不必太深究它,知道它的作用後,我們就可以利用它來為我們的開發提供便利。 我們只需要將剛剛建立的 CLog.h 也在這裡面引入一下,這樣我們項目中的所有檔案就都能夠訪問到我們剛剛定義的 CLog 宏了。 下面是完成後的 pch 檔案:
- #import <Availability.h>
- #ifndef __IPHONE_3_0
- #warning "This project uses features only available in iPhone SDK 3.0 and later."
- #endif
- #ifdef __OBJC__
- #import <UIKit/UIKit.h>
- #import <Foundation/Foundation.h>
- #import "CLog.h"
- #endif
這樣,我們的 CLog 就完成了,現在可以在任何一個源檔案中實用 CLog 宏來輸出日誌,預先處理命令會自動判斷當前的編譯配置,如果是 Debug,就會輸出日誌,反之則什麼都不會輸出。
小結:iPhone應用根據Debug和Release狀態變化來屏蔽日誌輸出的內容介紹完了,希望通過學習對你有所協助。