【iOS】desctiption和debugDescription

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 = [[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.htmlorm

@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保留默認的實現

相關文章
相關標籤/搜索