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...