iOS開發 除錯必備 NSLog

2021-09-11 06:03:34 字數 3242 閱讀 6633

1、ios nslog----

2、ios專案之nslog相關----

3、ios nslog 控制台 輸出中文----

4、再見了nslog----

對於程式的開發者來說,擁有一手強大的debug能力,那就好比在武俠世界中擁有一種強大的內功心法一樣,走到**都是大寫的牛b。在我們debug的時候,大部分情況都是要檢視我們的除錯日誌的,這些列印日誌可以幫我們精確的定位問題的位置。在oc的程式設計中,我們一般使用nslog函式來進行一些列印的工作,這大致相當於c語言的printf輸出語句。

nslog定義在nsobjcruntime.h中,如下所示:

void nslog(nsstring *format, …);

省略號表示可接收多個引數。

nslog使用起來和printf是很相似的,都是格式化的輸出,不同的是printf需要的格式化字串是char *型別,而nslog需要的字串是nsstring型。

nslog中會使用到的格式化佔位符:

%@ 物件

%d, %i 整數

%u 無符整形

%f 浮點/雙字

%x, %x 二進位制整數

%o 八進位制整數

%zu size_t

%p 指標

%e 浮點/雙字 (科學計算)

%g 浮點/雙字

%s c字串

%.*s pascal字串

%c 字元

%c unichar

%lld 64位長整數(long long)

%llu 無符64位長整數

%lf 64位雙字

示例:// 直接列印字串

nslog(@"this is a string");

// 列印oc物件

nsstring *string = @"hello world";

nslog(@"%@", string);

// 列印基本資料型別

nslog(@"int : %d, float : %f", 2, 3.14);

通過上面的例子我們不難發現在nslog中使用%@佔位符來列印物件的功能是非常強大的,它不僅可以列印字串、字典、陣列等oc中已經定義的物件型別,我們自定義的物件型別也可以使用%@來列印。nslog配合%@使用時,編譯器會自動呼叫被列印物件的description方法,如果列印的是類物件則呼叫類方法,例項物件則呼叫例項方法。繼承於nsobject類的description方法缺省會列印該物件的類名和它在記憶體中的位址。

新建乙個people類,自定義description方法,除錯列印。

people.h:

#import

@inte***ce people : nsobject

@property (nonatomic, copy) nsstring *name;

@property (nonatomic, copy) nsstring ****;

@property (nonatomic, assign) int age;

@end

people.m:

#import "people.h"

@implementation people

// 不要嘗試在description方法中返回self,因為會出現死迴圈

- (nsstring *)description 

+ (nsstring *)description 

@end

測試**:

// 建立並初始化乙個people例項p

people *p = [[people alloc] init];

p.name = @"jack";

p.*** = @"man";

p.age = 18;

// 列印例項p,呼叫自己定義的description例項方法

nslog(@"%@", p);

// 列印people類,呼叫自己定義的description類方法

nslog(@"%@", [p class]); // 類物件或者例項物件呼叫class方法會返回物件的類的所有資訊,返回值為class型別

自己實現description方法可以列印我們想要看到的內容,更加便於除錯,但是在description方法中不要返回或者列印self。

從上面的例子我們可以看到使用nslog列印出來的日誌前面帶有很長一串的時間戳,可能有時候我們根本用不到,而且還會影響檢視的效率。其實對於nslog的輸出格式我們也是可以自定義的,只需要我們寫乙個巨集定義就可以了。

如果只想讓nslog列印我們輸出的內容:

#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的使用效率比較低,所以在我們的專案中非除錯狀態下不應該出現大量的nslog,所以有些時候我們會在專案的.pc**件中去定義乙個巨集,讓除錯列印函式只在除錯的時候有用,發布的時候就不能使用。

在xcode6之前,專案中supporting files資料夾下有個 「工程名-prefix.pch」檔案,你可以在該檔案下宣告我們的巨集,這樣之後工程中的任何乙個檔案中都可以使用該巨集(也就是說可以在.pch中放一些全域性的東西)。xcode6之後,可能是因為大家把大量的標頭檔案和巨集定義放到pch裡邊,導致編譯時間過長,蘋果就去掉了pc**件,但是我們仍可以手動新增。

實用版本:

#ifdef debug

#define nslog(format, ...) fprintf(stderr,"%s:%d\t %s\n",[[[nsstring stringwithutf8string:__file__] lastpathcomponent] utf8string], __line__, [[nsstring stringwithformat:format,##__va_args__] utf8string]);

#else

#define nslog(...)

#endif

除錯必備 NSLog使用方法

nslog定義在nsobjcruntime.h中,如下所示 void nslog nsstring format,基本上,nslog很像printf,同樣會在console中輸出顯示結果。不同的是,傳遞進去的格式化字元是nsstring的物件,而不是chat 這種字串指標。nslog可以如下面的方法...

iOS開發 NSLog不列印設定

我們可以在發布版本前先把所有nslog語句注釋掉,等以後要除錯時,再取消這些注釋,這實在是一件無趣而耗時的事!還好,還有更優雅的解決方法,就是在專案的prefix.pch檔案裡加入下面一段 加入後,nslog就只在debug下有輸出,release下不輸出了。在 prefix.pch pch全稱是 ...

iOS開發中NSLog的替換

在objective c中,nslog相當於c語言中的printf,常用於輸出。替代開發中debug時的nslog,release模式編譯的程式不會用nslog輸出,而以debug模式編譯的程式將執行nslog的全部功能,在發布時不用再刪除輸出操作 ifdef debug define debugl...