今天在看公司代碼的時候發現了一段代碼

項目里幾乎所有的方法都使用了DLog,但是並沒有相關內容被打印出來,所以就很奇怪,后來發線是第一行多寫了一個下划線,把下划線去掉就能輸出了,可能是輸出的log太多他把這個幾行代碼廢掉了,讓我郁悶半天,關於這段代碼有一個博客已經很好的解釋了https://www.jianshu.com/p/00c603669085
在開發過程中,我們經常需要用到NSLog輸出一些信息,甚至有的開發過程,必須在控制台查看輸出,有經驗的程序員通過控制台輸出就能知道整個數據交互的一個流程.但是一個發布的程序,里面帶有太多的NSLog輸出,肯定對於App性能有所影響,這時候我們可以使用一個宏定義來處理,在開發的時候使用DEBUG模式,在發布的時候使用RELEASE模式.這樣,發布的App就不會在程序內部做大量的NSLog輸出了.
簡單的代碼如下:
#if defined (DEBUG)||defined(_DEBUG) NSLog(@"測試代碼"); NSLog(@"Test Coding"); #endif
上面的#if #endif宏定義的意思就是如果定義了DEBUG,那么就使用NSLog輸出;否則這段代碼就直接忽略不執行.有人會疑問這個DEBUG和_DEBUG來自哪里,這個其實不用擔心,這個來自於Xcode的默認設置,我們可以取消DEBUG模式,開啟RELEASE發布模式,如下面的截圖所示.
選擇Product->Scheme->Edit Scheme

App發布的時候,這些全部都要改成release模式
這些都選為release,就意味着默認沒有定義Debug,則上面代碼中#if...#endif之間的輸出NSLog不會執行.這樣在發布應用程序的時候,就節省了一些硬件設備的資源.
如何確定項目是處於Debug模式還是Release模式下?
首先確定一下項目的Build Settings是否已經設置過宏定義DEBUG,

如果已經設置過,在Preprocessor Macros的Debug后面會有DEBUG=1,如果沒有,就手動設置一下.
接下來就可以這樣做:
#ifdef DEBUG // do sth #else // do sth #endif
也可以使用正則NSLog語句:
#ifndef DEBUG #undef NSLog #define NSLog(args,...) #endif
幸運的是,這里有一個最簡單的辦法進行log——通過一個宏,讓NSLog只在debug build的時候起作用。將這個功能添加到全局都能訪問得到的頭文件中。這樣你就可以盡情的使用log了,並且當進行production時,不會包含log相關代碼。如下代碼:
#ifdef DEBUG #defineDMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__]) #else# defineDMLog(...)do{}while(0)
補充:如果上面的寫法有點復雜 下面的寫法就簡單的多
//release屏蔽NSLog //放在.pch文件里 #ifdef DEBUG #else #define NSLog(...) {}; #endif
現在如果使用DMLog,那么將只會在debug build期間打印出log。而production build時則不會有任何log。通過PRETTY_FUNCTION可以打印出打印log所在的函數。
總結:雖然NSLog非常出色,但它也有一些限制:
只能在本地打印
不支持帶級別的log(例如嚴重、警告等)
NSLog效率低。在進行大量處理時,NSLog會嚴重影響程序的執行效率
互聯網上也有一些框架可以進行日志記錄,通過這些框架可以避免NSLog的一些限制。下面有兩個不錯的:
Cocoa LumberJack – 這是針對Cocoa非常出名的一個日志框架。雖然剛開始用的時候會費勁點,但是它非常強大。
SNLog – NSLog的一個替代品。
