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保留默认的实现