en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

6.08.2011

NSLog 的二三事

NSLog 這個函式是在撰寫 iOS 程式時候的小幫手,它可以幫確認數值、物件以及設定的方法是否有正確被呼叫等等。使用上通常會在 NSLog 函式中加入需要的 NSString 的字串,好在除錯時提供辨識。下面提供幾個常用的 NSLog 參數,並嘗試將其寫成巨集 Macro,方便日後在 Debug 時使用。

//得到目前執行的Class與函式名稱(包含類別方法和實體方法)
NSLog(@"%s", __func__);

//也可以猜開撰寫
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromSelector(_cmd));

//獲得行數
NSLog(@"%d", __LINE__);

//物件記憶體釋放情形
NSObject *furnace = [[NSObject alloc] autorelease];
NSLog(@"Retain Count = %d",[furnace retainCount]);
[furnace retain];
NSLog(@"Retain Count = %d",[furnace retainCount]);
[furnace release];
NSLog(@"Retain Count = %d",[furnace retainCount]);

 

如果每次都要這樣打一大串的程式碼,也可以考慮使用巨集 Macro 的方式,撰寫的方法其實就是在程式碼最一開頭使用 #define 定義式( Preprocessor 前端處理程式)。

#ifdef DEBUG
#    define SHOW_CLASS_METHOD NSLog(@"%s", __func__)
#    define SHOW_CLASS NSLog(@"%@", NSStringFromClass([self class]))
#    define SHOW_METHOD NSLog(@"%@", NSStringFromSelector(_cmd))
#    define SHOW_LINE NSLog(@"%d", __LINE__)
#    define SHOW_RETAIN_COUNT(object) NSLog(@"%d", [object retainCount])
#else
#    define SHOW_CLASS_METHOD
#    define SHOW_CLASS
#    define SHOW_METHOD
#    define SHOW_LINE NSLog(@"%d", __LINE__)
#    define SHOW_RETAIN_COUNT(object)
#endif

巨集中的 #ifdef、DEBUG、#else 與 #endif,目的只是為了讓 Xcode 在 Debug 模式執行下才會引入這些巨集的實做方法,如果不是在 Debug 模式下(例如 Release 模式),就不會引入其實做方法,即使呼叫這些巨集也不會有任何事情發生。有了巨集之後在使用上也變的非常方便,程式碼如下。

//得到目前執行的Class與函式名稱(包含類別方法和實體方法)
SHOW_CLASS_METHOD;

//也可以猜開撰寫
SHOW_CLASS;
SHOW_METHOD;

//獲得行數
SHOW_LINE;

//物件記憶體釋放情形
NSObject *furnace = [[NSObject alloc] autorelease];
SHOW_RETAIN_COUNT(furnace);
[furnace retain];
SHOW_RETAIN_COUNT(furnace);
[furnace release];
SHOW_RETAIN_COUNT(furnace);


最後,NSLog 函式能使用的參數當然不只這一點點,如果各位讀者有其他特殊需求也可以參閱 Objective-C 或是 C 的技術文件,並製作自己方便使用的巨集。






沒有留言:

張貼留言