Description &&debugDescription && runtime(debug模式下調試model),describe
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 <objc/runtime.h>//匯入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<count; i++) { objc_property_t property = properties[i]; NSString *name = @(property_getName(property)); id value = [self valueForKey:name]?:@"nil";//預設值為nil字串 [dictionary setObject:value forKey:name];//裝載到字典裡 } //釋放 free(properties); //return return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];}@end
然後在列印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 <objc/runtime.h>//匯入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<count; i++) { objc_property_t property = properties[i]; NSString *name = @(property_getName(property)); id value = [self valueForKey:name]?:@"nil";//預設值為nil字串 [dictionary setObject:value forKey:name];//裝載到字典裡 } //釋放 free(properties); //return return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];}@end
看如, 分別使用了NSLog
和po
命令的列印
這裡寫圖片描述結果:
這裡寫圖片描述這就達到了我們想要的效果, 如果需要列印model
的屬性, 打個斷點然後使用po
命令即可