改寫(xiě)NSLog的方法和好處

不直接用NSLog

摘要: 公司中不直接使用NSLog,而是利用宏定義自己的打印函數(shù),將該打印函數(shù)寫(xiě)在項(xiàng)目的.pch文件中.調(diào)試的時(shí)候往往用到好多打印,但發(fā)布的時(shí)候確不需要.(以下下是在公司中的一些處理)

一,固定寫(xiě)法:

#define? TTLog(...)? NSLog(__VA_ARGS__)

二,注意:

1,TTLog括號(hào)中的...是固定寫(xiě)法,表示可以接受任意多個(gè)參數(shù).

2,NSLog括號(hào)中的__VA_ARGS__? 也是固定寫(xiě)法,前后用了兩個(gè)下劃線

三,使用方式:

在pch文件里添加下圖代碼(pch文件的添加方法自己百度下)

項(xiàng)目中Supporting files文件夾下有個(gè) "工程名-Prefix.pch"文件,你可以在該文件下聲明

#define? TTLog(...)? NSLog(__VA_ARGS__)

這樣之后工程中的任何一個(gè)文件中都可以使用改自定的打印函數(shù)(也就是說(shuō)可以在該.pch中放一些全局的東西)

四,好處:

這樣改寫(xiě)的好處是以后你測(cè)試發(fā)布時(shí) 改寫(xiě)的NSLog就不執(zhí)行了(調(diào)試的時(shí)候TTLog會(huì)執(zhí)行,測(cè)試的時(shí)候//NSLog(__VA_ARGS__)那么調(diào)試的時(shí)候打印的TTLog就不執(zhí)行了,不用你一個(gè)個(gè)去找去注釋了)

這樣使用的好處就是,項(xiàng)目調(diào)試期間,我們可能會(huì)用到好多TTLog()函數(shù)打印.

如果不需要時(shí),只需將.pch中該宏修改為:(這樣就相當(dāng)于TTLog()代表的是注釋了)

#define? TTLog(...)? //NSLog(__VA_ARGS__)

五,修改:(這樣做還不夠智能,每次調(diào)試的時(shí)候需要用到打印,發(fā)布的時(shí)候不需要打印還要手動(dòng)修改一下)

其實(shí)系統(tǒng)提供了一個(gè)宏? DEBUG 表示在調(diào)試狀態(tài)下

因?yàn)樯鲜龃a可以?xún)?yōu)化為:? ? (下述代碼是公司常用代碼)

#ifdef DEBUG? //調(diào)試階段

#define TTLog(...)? NSLog(__VA_ARGS__)

#else //發(fā)布階段

#define TTLog(...)

#endif

關(guān)于修改TTLog后不執(zhí)行(不打印)的問(wèn)題:

前提:在XCode做開(kāi)發(fā)調(diào)試時(shí)往往需要打印一些調(diào)試信息做debug用,大家知道當(dāng)打印信息的地方多了之后在模擬器上跑可能不會(huì)有什么問(wèn)題,因?yàn)槟M器用的是電腦的硬件但是當(dāng)應(yīng)用跑在設(shè)備上時(shí)這些輸出語(yǔ)句會(huì)在很大程度上影響應(yīng)用的性能,針對(duì)這種問(wèn)題可以寫(xiě)一些宏來(lái)控制這些調(diào)試信息的輸出。

在release版本禁止輸出NSLog內(nèi)容

因?yàn)镹SLog的輸出還是比較消耗系統(tǒng)資源的,而且輸出的數(shù)據(jù)也可能會(huì)暴露出App里的保密數(shù)據(jù),所以發(fā)布正式版時(shí)需要把這些輸出全部屏蔽掉。

我們可以在發(fā)布版本前先把所有NSLog語(yǔ)句注釋掉,等以后要調(diào)試時(shí),再取消這些注釋?zhuān)@實(shí)在是一件無(wú)趣而耗時(shí)的事!還好,還有更優(yōu)雅的解決方法,就是在項(xiàng)目的prefix.pch文件里加入下面一段代碼,加入后,NSLog就只在Debug下有輸出,Release下不輸出了。

如何實(shí)現(xiàn):

在-Prefix.pch(pch全稱(chēng)是“precompiled header”,也就是預(yù)編譯頭文件,該文件里存放的工程中一些不常被修改的代碼,比如常用的框架頭文件,這樣做的目的提高編譯器編譯速度。我們知道當(dāng)我們修改一個(gè)工程中某個(gè)文件代碼時(shí)候,編譯器并不是重新編譯所有所有文件,而是編譯改動(dòng)過(guò)文件的,假如pch中某個(gè)文件修改了,那么pch整個(gè)文件里包含的的其他文件也會(huì)重新編譯一次,這樣就會(huì)消耗大量時(shí)間,所以它里面添加的文件最好是是很少變動(dòng)或不變動(dòng)的頭文件或者是預(yù)編譯的代碼片段;)文件中添加

#ifdef DEBUG

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

#define debugMethod() NSLog(@"%s", __func__)

#else

#define NSLog(...)

#define debugMethod()

#endif

上段代碼的意思就是 用宏指令做一個(gè)判斷,如果DEBUG為真,則編譯#ifdef到#endif宏定義,否則編譯器就不編譯;

這個(gè)DEBUG在哪設(shè)置呢

在 "Target > Build Settings > Preprocessor Macros > Debug" 里有一個(gè)"DEBUG=1"。

(我的pch里寫(xiě)了宏但還是不打印,就把Target > Build Settings > Preprocessor Macros > Debug為USE_FILE32API CC_TARGET_OS_IPHONE COCOS2D_DEBUG=1 CC_ENABLE_CHIPMUNK_INTEGRATION=1改成"DEBUG=1",就打印了)

設(shè)置為Debug模式下,Product-->Scheme-->SchemeEdit Scheme設(shè)置Build Configuration成Debug時(shí),就可以打印nslog了。設(shè)置Release,發(fā)布app版本的時(shí)候就不會(huì)打印了,提高了性能

進(jìn)一步交流 QQ群:224110749

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容