對于任何一家公司的任何一個(gè)項(xiàng)目來說风皿,調(diào)試信息都是必不可少的疾牲,也就是說NSLog必定會頻繁使用嬉愧,但是NSLog所輸出的調(diào)試信息并不是任何情況都需要的乍丈。
一般來說剂碴,開發(fā)環(huán)境是需要我們使用NSLog來打印一些信息,方便我們處理數(shù)據(jù)诗赌、bug查找等,但是對于線上環(huán)境秸弛,也就是用戶使用的release環(huán)境的APP是不需要的铭若,如果強(qiáng)行輸出會造成性能上的問題,這并不是我們需要的递览。所以叼屠,幾乎所有的項(xiàng)目都會自定義NSLog宏。
絕大多數(shù)的NSLog宏都是僅輸出我們調(diào)用時(shí)最終需要使用的信息绞铃,代碼示例如下
#ifdef BETA
#define DebugNSLog(format, ...) NSLog(format, ## __VA_ARGS__)
#else
#define DebugNSLog(...) /* */
#endif
說明
#ifdef BETA指的是開發(fā)環(huán)境下镜雨,DebugNSLog == NSLog。#else指的是release環(huán)境下 DebugNSLog 是沒有實(shí)現(xiàn)的儿捧,也就是說BETA環(huán)境下荚坞,DebugNSLog等同于NSLog,而其他都視為無作用菲盾。
關(guān)于環(huán)境宏:BETA 是自己起的颓影,正常情況下,XCode 默認(rèn)兩種環(huán)境宏變量
- Debug
-
Release
如果你的項(xiàng)目是自定義的宏變量懒鉴,可以再下圖地方查看
image.png
這是我這里的配置诡挂,左邊是配置的環(huán)境,配置方法如下圖所示
image.png
右側(cè)對應(yīng)的是 宏變量名稱和值临谱,比如說 Beta 這個(gè)環(huán)境下璃俗,他的環(huán)境宏為 BETA ,值為 1悉默,也就是說城豁,Beta 下, if (BETA = YES) 成立 ,因?yàn)?項(xiàng)目使用了 cocoapods 抄课,而cocoapods 有自己的 環(huán)境宏钮蛛,他默認(rèn)值都是 1鞭缭,也就是說,無論在那個(gè)環(huán)境下魏颓, cocoapods 都可用
按理來說岭辣,這樣的定義就已經(jīng)夠我們使用了,但是甸饱,當(dāng)我們各個(gè)地方都調(diào)用了DebugNSLog來進(jìn)行輸出的話沦童,勢必要配合斷點(diǎn)來查看我們當(dāng)前想要看到的輸出信息,否則APP啟動輸出了1千條信息叹话,你怎么能知道是你要看到的信息呢(其實(shí)我舉得這個(gè)例子不是特別好)偷遗,這種情況下我們可以調(diào)整宏定義,示例代碼如下
#ifdef BETA
#define DebugNSLog(formater,...) NSLog((@"函數(shù):%s\n" "代碼位置行數(shù): %d\n" formater),__FUNCTION__,__LINE__,##__VA_ARGS__)
#else
#define DebugNSLog(...) /* */
#endif
說明
- __FUNCTION__是類的方法名稱驼壶,
- __LINE__是輸出方法所在這個(gè)類的具體代碼行數(shù)氏豌,
- ##__VA_ARGS__同普通打印宏一樣
##__VA_ARGS__
是一個(gè)可變參數(shù)的宏,這個(gè)可變參數(shù)的宏是新的C99規(guī)范中新增的热凹,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)泵喘。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個(gè)數(shù)為0時(shí)般妙,這里的##的作用是把前面多余的","去掉,否則會編譯出錯(cuò)纪铺。
使用最終效果
//代碼 viewDidLoad方法里調(diào)用
DebugNSLog(@"==調(diào)試==");
//控制臺輸出結(jié)果
2019-01-25 15:19:54.509437+0800 shequbanjing[12451:728498] 函數(shù):-[SQPlazaViewController viewDidLoad]
代碼位置行數(shù): 97
==調(diào)試==
補(bǔ)充
目前自己在用的寫法是:
#define DebugNSLog(formater,...) NSLog((@"\n====================\n >>> class: %s\n\n >>> method: %s\n\n" " >>> code line: %d 行\(zhòng)n\n >>> message: " formater @"\n==================="),__FILE__,__FUNCTION__,__LINE__,##__VA_ARGS__)
最終輸出樣式
2019-02-26 15:43:05.104862+0800 sqbj-common-kit[99393:9668747]
====================
>>> class: /Users/BlackStar/Downloads/sqbj-common-kit/sqbj-common-kit/ViewController.m
>>> method: -[ViewController viewDidLoad]
>>> code line: 26 行
>>> message: test Log
===================