本文為投稿文章,作者:咖啡豬_iOSer
description
在開發過程中, 往往會有很多的model來裝載屬性. 而在開發期間經常會進行調試查看model裡的屬性值是否正確. 那麼問題來了, 在Objective-C裡使用NSLog("%@",model)這行代碼打印出來的卻是model的地址. 不是我們所想要的結果~! 看圖:
那麼問題又來了?有沒有辦法解決這個問題尼,答案那就是有~!只需要重寫- (NSString *)description方法即可。如下代碼:
.h文件
#import [Foundation/Foundation.h](編輯注:因識別問題,這裡將尖括號改為方括號) @interface TestModel : NSObject @property (copy,nonatomic) NSString *text; @property (assign,nonatomic) NSInteger index; @end
.m文件
#import "TestModel.h" @implementation TestModel - (NSString *)description { return [NSString stringWithFormat:@"text:%@--index:%zi",self.text,self.index]; } @end
然後這時候在使用NSLog("%@",model)這行代碼就能打印我們想要的結果了。 看如下圖:
那麼問題繼續來了...
如果model裡有N多個屬性尼, 可能10個, 可能20個... 難道要在description方法裡一個一個寫屬性並拼接返回? 你不嫌麻煩, 我光看著都蛋疼了... 所以我們可以采用runtime技術來動態獲取屬性並返回. 如下修改後的.m文件代碼:
修改後的.m文件
#import "TestModel.h" #import //導入runtime頭文件 @implementation TestModel - (NSString *)description { //初始化一個字典 NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到當前class的所有屬性 uint count; objc_property_t *properties = class_copyPropertyList([self class], &count); //循環並用KVC得到每個屬性的值 for (int i = 0; i然後在打印model, 如下圖:
debugDescription
現在問題繼續來了..
在項目中NSLog語句往往也很多. 如果重寫description方法. 在控制台則會打印出很多屬性. 看著就不舒服~~而且還有一個問題就是, 有時候我們其實並不需要打印model的屬性.. 那這樣重寫description方法反而適得其反了! 所有, 現在有一個解決方案就是重寫debugDescription方法
什麼是debugDescription? 其實debugDescription和description是一樣的效果. 只不過唯一的區別就是debugDescription是在Xcode控制台裡使用po命令的時候調用的~!
而debugDescription的實現其實也就是調用了description方法而已。
so, 在開發過程中並且model調試的時候, 筆者推薦重寫debugDescription方法而不是重寫description方法. 當需要打印model的屬性的時候, 在控制台裡使用po命令即可. 如下在此修改後的.m文件
#import "TestModel.h" #import //導入runtime頭文件 @implementation TestModel // 重寫debugDescription, 而不是description - (NSString *)debugDescription { //聲明一個字典 NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; //得到當前class的所有屬性 uint count; objc_property_t *properties = class_copyPropertyList([self class], &count); //循環並用KVC得到每個屬性的值 for (int i = 0; i看如下圖, 分別使用了NSLog和po命令的打印
結果:
這就達到了我們想要的效果, 如果需要打印model的屬性, 打個斷點然後使用po命令即可
Demo地址
最後,附上本文章的一個小demo示例代碼,已放在github上。
https://github.com/DemoMania/DebugDescriptionDemo
總結
model調試的時候, 推薦重寫debugDescription而不是description
利用runtime技術動態獲取class的屬性
在base基類裡重寫debugDescription方法,隨後所有model繼承與baseModel即可。
在重寫的debugDescription的方法裡最好不要調用自身debugDescription([self debugDescription])