iOS中 項(xiàng)目中的NSLog的處理

在iOS開(kāi)發(fā)過(guò)程中,我們經(jīng)常要用到NSLog來(lái)打印一些調(diào)試信息,而且一般是習(xí)慣性的大量使用,在模擬器上運(yùn)行可能沒(méi)有感覺(jué)到什么,但是在真機(jī)上,NSLog的輸出還是比較消耗系統(tǒng)資源的,而且輸出的數(shù)據(jù)有時(shí)也可能會(huì)暴露出App中的某些數(shù)據(jù),所以發(fā)布正式版時(shí)需要把這些輸出全部屏蔽掉。


我們可以在發(fā)release包之前將這些NSLog統(tǒng)統(tǒng)注釋掉,但是如果是大量使用,就有些太過(guò)麻煩,而且下次開(kāi)發(fā)時(shí),又需要將注釋分別打開(kāi)繼續(xù)使用,這樣做著實(shí)無(wú)趣。下面列舉兩種方式解決:

1.通過(guò)DEBUG條件編譯全局控制

因?yàn)槭侨挚刂?,首先?chuàng)建pch文件,具體方法較為簡(jiǎn)單,不過(guò)在Xcode6之后注意綁定pch文件的相對(duì)路徑,

設(shè)置pch戳這里,創(chuàng)建好之后,在pch文件中添加下列代碼:

#ifdef DEBUG

#define AllLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函數(shù)名:%s]\n" "[行號(hào):%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

#define NSLog(...) NSLog(__VA_ARGS__);

#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

#else

#define AllLog(...)

#define DeBugLog(...)

#define NSLog(...)

#define MyNSLog(FORMAT, ...)

#endif

上述代碼中詳細(xì)列舉了四種較為常用的NSLog的封裝,一些事參考了網(wǎng)友的寫法,已做實(shí)際驗(yàn)證。


補(bǔ)充:

1)VA_ARGS是一個(gè)可變參數(shù)的宏,很少人知道這個(gè)宏,這個(gè)可變參數(shù)的宏是新的C99規(guī)范中新增的,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個(gè)數(shù)為0時(shí),這里的##起到把前面多余的","去掉的作用,否則會(huì)編譯出錯(cuò), 你可以試試。

2)FILE宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的源文件名

3)LINE宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)

4)FUNCTION宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱

下一步是Debug和Release環(huán)境的設(shè)置:

1."Target > Build Settings > Preprocessor Macros > Debug" 里有一個(gè)"DEBUG=1",這保證了我們的條件編譯的"#if"可以編譯。如果沒(méi)有,請(qǐng)自行添加,注意和代碼中的#if后面的字段保持一致。

2017-11-17-1

2.環(huán)境配置見(jiàn)下圖,通過(guò)切換Debug和Release,可以控制當(dāng)前工程的編譯環(huán)境,當(dāng)在release環(huán)境下時(shí),pch預(yù)編譯的NSLog相關(guān)函數(shù)執(zhí)行是無(wú)效的。

2017-11-17-2


2017-11-17-3

2.通過(guò)自定義條件編譯條件全局控制


1.首先自定義全局環(huán)境條件編譯控制字段

/**

*? 工程全局環(huán)境控制

*

*? 0:開(kāi)發(fā)環(huán)境? 1:發(fā)布環(huán)境? 2:測(cè)試環(huán)境

*/

#define MY_PROJECT_GLOBAL_CONTROL 0

上面的0、1、2看個(gè)人習(xí)慣,只要分得清楚各種環(huán)境就行。具體工程的編譯環(huán)境當(dāng)然也不局限于上述三類。

在開(kāi)發(fā)或上線時(shí),只要記得修改上述的值以對(duì)應(yīng)于相應(yīng)的環(huán)境就行,當(dāng)然最好是工程有對(duì)應(yīng)的幾個(gè)target,這樣也就可分別設(shè)置,分別使用,不會(huì)混淆了。

2.同方法1一樣,添加下面的代碼:

#if (MY_PROJECT_GLOBAL_CONTROL == 0)

#define AllLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函數(shù)名:%s]\n" "[行號(hào):%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);

#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

#define NSLog(...) NSLog(__VA_ARGS__);

#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

#elif (MY_PROJECT_GLOBAL_CONTROL == 1)

#define AllLog(...)

#define DeBugLog(...)

#define NSLog(...)

#define MyNSLog(FORMAT, ...)

#endif

上述省略了測(cè)試環(huán)境,測(cè)試同開(kāi)發(fā)即可。

這種方式較1更為靈活。對(duì)應(yīng)的條件編譯當(dāng)然也不僅僅局限于NSLog,還有NSAssert或者是對(duì)應(yīng)環(huán)境的接口等的設(shè)置。

相關(guān)Demo在這里呢

原文:

http://www.itdecent.cn/p/2e79436e5fe3

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS開(kāi)發(fā)過(guò)程中,我們經(jīng)常要用到NSLog來(lái)打印一些調(diào)試信息,而且一般是習(xí)慣性的大量使用,在模擬器上運(yùn)行可能沒(méi)有...
    霖溦閱讀 12,192評(píng)論 18 81
  • http://www.open-open.com/lib/view/open1390651437117.html ...
    Xtuphe閱讀 1,364評(píng)論 0 10
  • 宏定義在C系開(kāi)發(fā)中可以說(shuō)占有舉足輕重的作用。底層框架自不必說(shuō),為了編譯優(yōu)化和方便,以及跨平臺(tái)能力,宏被大量使用,可...
    你好自己閱讀 1,121評(píng)論 0 5
  • /**獲取屏幕寬度與高度 導(dǎo)航,tabbar高度*/ #define SCREEN_WIDTH [UIScree...
    MUYO_echo閱讀 775評(píng)論 0 3
  • iOS開(kāi)發(fā)過(guò)程中,使用的一些常用宏定義 字符串是否為空#define kStringIsEmpty(str) ([...
    goyohol閱讀 5,536評(píng)論 30 84

友情鏈接更多精彩內(nèi)容