iPhone應(yīng)用根據(jù)Debug和Release狀態(tài)變化來屏蔽日志輸出
iPhone應(yīng)用根據(jù)Debug和Release狀態(tài)變化來屏蔽日志輸出是我們要介紹的內(nèi)容,我們平時(shí)在開發(fā)應(yīng)用的時(shí)候,經(jīng)常會用到 NSLog 來調(diào)試我們的程序,而隨著項(xiàng)目越來越大,這些用于調(diào)試的日志輸出就會變得很難管理。 發(fā)布正式版的時(shí)候一定要屏蔽掉所有后臺輸出,因?yàn)檫@些輸出還是比較消耗系統(tǒng)資源的。 往往到了這個(gè)時(shí)候,我們不得不去一行一行的找到 NSLog 調(diào)用,然后注釋掉。
這樣做在項(xiàng)目小的時(shí)候還比較有效,但隨著項(xiàng)目規(guī)模的增長,就會變得越來越難控制。 下面就給大家介紹一個(gè)簡單的方法,讓我們在生成 Release 版本時(shí)不需要進(jìn)行任何更改即可屏蔽所有的日志輸出。
首先我們先要定義這樣一段預(yù)處理命令,文件名隨便起,例如 CLog.h
- #ifdef DEBUG
- #define CLog(format, ...) NSLog(format, ## __VA_ARGS__)
- #else
- #define CLog(format, ...)
- #endif
這里我們判斷 DEBUG 這個(gè)宏是否定義,如果有定義我們就將這個(gè) CLog 宏替換成 NSLog 調(diào)用,而如果沒有定義過 DEBUG 標(biāo)志我們就直接跳過。這點(diǎn)應(yīng)該不難理解。
檢查 DEBUG 標(biāo)志是否正確定義,Xcode 一般會在 debug 運(yùn)行配置項(xiàng)里面已經(jīng)定義號了DEBUG 標(biāo)志,如果沒定義我們就自己寫上,以我的 Xcode 4 為例,如下圖:
找到 PreProcessor Macros 這個(gè)屬性,對于 Debug 配置我們給他寫上 DEBUG,而在 Release 配置中把它留空。 這樣我們剛才那段預(yù)處理命令就可以根據(jù)這個(gè)標(biāo)志來判斷我們編譯的時(shí)調(diào)試版本還是發(fā)布版本,從而控制 NSLog 的輸出。 (因?yàn)?Xcode 4 會把 debug/release 兩個(gè)配置項(xiàng)同時(shí)對比展現(xiàn)出來,而 3.x 版本的只能分別設(shè)置,如果你用的時(shí)xcode 3.x 開發(fā)工具, 那么就分別對 Debug/Release 都檢查一下)。
到了這里我們這個(gè)判斷工作就都進(jìn)行完了,不過這里還有一點(diǎn)比較麻煩,就是我們?nèi)绻雽?shí)用 CLog 宏,就必須要導(dǎo)入 CLog.h 這個(gè)頭文件。 不過 Xcode 為我們提供了一種非常巧妙的解決辦法。 我們自己看一下項(xiàng)目里的文件,是不是有一個(gè)叫做 xxx-prefix.pch 的文件,只要注意到 pch 這個(gè)擴(kuò)展名就可以了。 這個(gè)文件是做什么用的呢? 下面是一個(gè) 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
這里引入了一些頭文件, 其實(shí)是 Xcode 的一種預(yù)編譯機(jī)制,我們在編譯一個(gè)項(xiàng)目的時(shí)候,會有很多常用的源文件,并且這些代碼文件幾乎不被修改,所以 Xcode 對這些文件只在早期進(jìn)行一次編譯,以便我們以后的多次構(gòu)建過程中反復(fù)實(shí)用。 例如這里的 UIKit 和 Foundation ,這樣的機(jī)制可以加快我們每次構(gòu)建項(xiàng)目的速度。
當(dāng)然這里我們不必太深究它,知道它的作用后,我們就可以利用它來為我們的開發(fā)提供便利。 我們只需要將剛剛建立的 CLog.h 也在這里面引入一下,這樣我們項(xiàng)目中的所有文件就都能夠訪問到我們剛剛定義的 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 就完成了,現(xiàn)在可以在任何一個(gè)源文件中實(shí)用 CLog 宏來輸出日志,預(yù)處理命令會自動(dòng)判斷當(dāng)前的編譯配置,如果是 Debug,就會輸出日志,反之則什么都不會輸出。
小結(jié):iPhone應(yīng)用根據(jù)Debug和Release狀態(tài)變化來屏蔽日志輸出的內(nèi)容介紹完了,希望通過學(xué)習(xí)對你有所幫助。