1、簡介html
與.NET同樣,在.NET上得Object對象有個ToString()方法能夠用於輸出對象的信息,在iOS上的NSObject也有一個方法,爲description,該方法返回objc對象的描述信息,當咱們調用NSLog打印一個對象或者NSString格式化輸出一個對象的時候,就會調用該方法,NSObject還有另外一個方法debugDescription,用於在調試控制檯輸出信息(在控制檯輸出對象信息如:po person),默認狀況下debugDescription調用的時description方法程序員
2、演示ide
@interface Person : NSObject @property (nonatomic, assign) NSUInteger age; @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSUInteger gender; @property (nonatomic, assign) float weight; @end @implementation Person @end
Person *person = [[Person alloc] init]; person.name =@"bomo"; person.age = 24; person.weight = 134; NSString *logMessage = [NSString stringWithFormat:@"%@", person]; NSLog(@"stringWithFormat: %@", logMessage); NSLog(@"nslog: %@", person);
默認狀況下,object-c對象只輸出對象名字和對象的地址,默認的實現應該是這樣的atom
- (NSString *)description { return [NSString stringWithFormat:@"<%@: %p>", NSStringFromClass([self class]), self]; }
通常這兩個信息對於咱們調試沒太大幫助,一般咱們但願看到類的更多屬性的信息,咱們能夠重寫description方法spa
@interface Person : NSObject @property (nonatomic, assign) NSUInteger age; @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) NSUInteger gender; @property (nonatomic, assign) float weight; @end
@implementation Person - (NSString *)description { return [NSString stringWithFormat:@"<Person: %p> {\n\tname=%@,\n\tage=%ld,\n\tweight=%f,\n\tgender=%lu\n}", self, self.name, self.age, self.weight, self.gender]; } @end
輸出下面信息debug
3、抽象基類調試
從上面看到,若是咱們要爲每一個model都重寫description方法,那就太費勁了,程序員都是很懶的,其實咱們能夠封裝一個通用的方法,經過運行時的API動態獲取到對象的類型,並輸出,該方法能夠給全部的類通用code
這裏建立一個基類BaseModel,咱們在基類實現一個通用的description方法(除了基類的方式,咱們也能夠重寫NSObject的description方法,應爲基本上全部的類都集成自NSObject,咱們不能拿到NSObject的源代碼,objc提供了一種叫method swizzling技術,能夠在運行時替換兩個方法的實現,咱們能夠吧NSObject的description換成咱們的實現,詳情參見:http://www.cnblogs.com/bomo/p/4693363.html)orm
@interface BaseModel : NSObject @end
@implementation BaseModel - (NSString *)description1 { id modelClass = [self class]; unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList(modelClass, &outCount); NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:outCount]; //遍歷出全部的屬性key/value
for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; NSString *propName = [NSString stringWithUTF8String:property_getName(property)]; id value = [[self valueForKey:propName] description]; [dict setObject:value forKey:propName]; } return [NSString stringWithFormat:@"<%@: %p> %@", NSStringFromClass([self class]), self, dict]; } - (NSString *)debugDescription { return [self description]; } @end
這是咱們的Person類只須要繼承自BaseModel便可實現如NSDictionary的輸出,這裏是利用的字典的輸出,就不用本身拼字符串htm
咱們也能夠只重寫debugDescription方法,在調試控制檯輸出的時候才輸出類的全部屬性信息,而description保留默認的實現