OC基礎(chǔ) — 調(diào)試必備NSLog

  • github

項目 簡介
MGDS_Swif 逗視視頻直播
MGMiaoBo 喵播視頻直播
MGDYZB 斗魚視頻直播
MGDemo n多小功能合集
MGBaisi 高度仿寫百思
MGSinaWeibo 高度仿寫Sina
MGLoveFreshBeen 一款電商App
MGWeChat 小部分實現(xiàn)微信功能
MGTrasitionPractice 自定義轉(zhuǎn)場練習(xí)
DBFMDemo 豆瓣電臺
MGPlayer 一個播放視頻的Demo
MGCollectionView 環(huán)形圖片排布以及花瓣形排布
MGPuBuLiuDemo 瀑布流--商品展
MGSlideViewDemo 一個簡單點的側(cè)滑效果普气,仿QQ側(cè)滑
MyResume 一個展示自己個人簡歷的Demo
GoodBookDemo 好書
Snip20161026_15.png

Snip20161026_16.png
逗視介紹1.gif

逗視介紹2.gif

  • 前言: 對于程序的開發(fā)者來說,擁有一手強(qiáng)大的DEBUG能力,那就好比在武俠世界中擁有一種強(qiáng)大的內(nèi)功心法一樣晦嵌,走到哪里都是大寫的牛B。在我們DEBUG的時候,大部分情況都是要查看我們的調(diào)試日志的惭载,這些打印日志可以幫我們精確的定位問題的位置旱函。在OC的編程中,我們一般使用NSLog函數(shù)來進(jìn)行一些打印的工作描滔,這大致相當(dāng)于C語言的printf輸出語句棒妨。

1.基本使用

NSLog定義在NSObjCRuntime.h中,如下所示:
void NSLog(NSString *format, …);
省略號表示可接收多個參數(shù)含长。
NSLog使用起來和printf是很相似的券腔,都是格式化的輸出,不同的是printf需要的格式化字符串是char *類型拘泞,而NSLog需要的字符串是NSString型纷纫。

  • NSLog中會使用到的格式化占位符:
 %@  對象
 %d, %i  整數(shù)
 %u  無符整形
 %f  浮點/雙字
 %x, %X  二進(jìn)制整數(shù)
 %o  八進(jìn)制整數(shù)
 %zu  size_t
 %p  指針
 %e  浮點/雙字 (科學(xué)計算)
 %g  浮點/雙字
 %s  C字符串
 %.*s  Pascal字符串
 %c  字符
 %C  unichar
 %lld  64位長整數(shù)(long long)
 %llu  無符64位長整數(shù)
 %Lf  64位雙字

舉個例子eg:

 // 直接打印字符串
 NSLog(@"this is a string");
 
 // 打印OC對象
 NSString *string = @"hello world";
 NSLog(@"%@", string);
 
 // 打印基本數(shù)據(jù)類型
 NSLog(@"int : %d, float : %f", 2, 3.14);
Paste_Image.png

2. description 方法

通過上面的例子我們不難發(fā)現(xiàn)在NSLog中使用%@占位符來打印對象的功能是非常強(qiáng)大的,它不僅可以打印字符串陪腌、字典辱魁、數(shù)組等OC中已經(jīng)定義的對象類型,我們自定義的對象類型也可以使用%@來打印诗鸭。NSLog配合%@使用時染簇,編譯器會自動調(diào)用被打印對象的description方法,如果打印的是類對象則調(diào)用類方法只泼,實例對象則調(diào)用實例方法剖笙。繼承于NSObject類的description方法默認(rèn)會打印該對象的類名和它在內(nèi)存中的地址。

  • 新建一個People類请唱,自定義description方法,調(diào)試打印过蹂。
    • People.h:
#import <Foundation/Foundation.h>
@interface People : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, assign) int age;
@end
  • People.m:
#import "People.h"
@implementation People
// 不要嘗試在description方法中返回self十绑,因為會出現(xiàn)死循環(huán)
-(NSString *)description {
    /*
     // 錯誤示范
     return [NSString stringWithFormat:@"%@", self];
   */
     return [NSString stringWithFormat:@"name: %@, sex: %@, age: %d",
     self.name, self.sex, self.age];
}
+(NSString *)description {
     return @"People";
}
@end
  • 測試代碼:
 // 創(chuàng)建并初始化一個People實例p
 People *p = [[People alloc] init];
 p.name = @"jack";
 p.sex = @"man";
 p.age = 18;
 
 // 打印實例p,調(diào)用自己定義的description實例方法
 NSLog(@"%@", p);
 
 // 打印People類酷勺,調(diào)用自己定義的description類方法
 NSLog(@"%@", [p class]); // 類對象或者實例對象調(diào)用class方法會返回對象的類的所有信息本橙,返回值為Class類型
測試代碼打印

自己實現(xiàn)description方法可以打印我們想要看到的內(nèi)容,更加便于調(diào)試脆诉,但是在description方法中不要返回或者打印self甚亭。


3.自定義打印日志輸出內(nèi)容

從上面的例子我們可以看到使用NSLog打印出來的日志前面帶有很長一串的時間戳,可能有時候我們根本用不到击胜,而且還會影響查看的效率亏狰。其實對于NSLog的輸出格式我們也是可以自定義的,只需要我們寫一個宏定義就可以了偶摔。

  • 如果只想讓NSLog打印我們輸出的內(nèi)容:
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
  • 附加輸出文件名和打印語句的行號:
#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

由于NSLog的使用效率比較低暇唾,所以在我們的項目中非調(diào)試狀態(tài)下不應(yīng)該出現(xiàn)大量的NSLog,所以有些時候我們會在項目的.pch文件中去定義一個宏,讓調(diào)試打印函數(shù)只在調(diào)試的時候有用策州,發(fā)布的時候就不能使用瘸味。
在Xcode6之前,項目中Supporting files文件夾下有個 “工程名-Prefix.pch”文件,你可以在該文件下聲明我們的宏够挂,這樣之后工程中的任何一個文件中都可以使用該宏(也就是說可以在.pch中放一些全局的東西)旁仿。Xcode6之后,可能是因為大家把大量的頭文件和宏定義放到pch里邊孽糖,導(dǎo)致編譯時間過長丁逝,蘋果就去掉了pch文件,但是我們?nèi)钥梢允謩犹砑印?/p>

  • 實用版本:
#ifdef DEBUG
#define NSLog(FORMAT, ...) MGLog(stderr,"%s:%d\t %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梭姓,一起剝皮案震驚了整個濱河市霜幼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誉尖,老刑警劉巖罪既,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铡恕,居然都是意外死亡琢感,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門探熔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媚值,“玉大人枢劝,你說我怎么就攤上這事。” “怎么了罕偎?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長刷钢。 經(jīng)常有香客問我爽丹,道長,這世上最難降的妖魔是什么绿满? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任臂外,我火速辦了婚禮,結(jié)果婚禮上喇颁,老公的妹妹穿的比我還像新娘漏健。我一直安慰自己,他們只是感情好橘霎,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布蔫浆。 她就那樣靜靜地躺著,像睡著了一般茎毁。 火紅的嫁衣襯著肌膚如雪克懊。 梳的紋絲不亂的頭發(fā)上忱辅,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音谭溉,去河邊找鬼墙懂。 笑死,一個胖子當(dāng)著我的面吹牛扮念,可吹牛的內(nèi)容都是我干的损搬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柜与,長吁一口氣:“原來是場噩夢啊……” “哼巧勤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弄匕,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颅悉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迁匠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剩瓶,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年城丧,在試婚紗的時候發(fā)現(xiàn)自己被綠了延曙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亡哄,死狀恐怖枝缔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚊惯,我是刑警寧澤愿卸,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站拣挪,受9級特大地震影響擦酌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜菠劝,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睁搭。 院中可真熱鬧赶诊,春花似錦、人聲如沸园骆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锌唾。三九已至锄码,卻和暖如春夺英,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滋捶。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工痛悯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人重窟。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓载萌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親巡扇。 傳聞我的和親對象是個殘疾皇子扭仁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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