实现description方法
在调试程序时,经常需要打印对象信息,类似的经常在代码中使用
NSLog(@"object = %@", object);
或者在控制台中使用po
命令
po object
一般情况下这两种方式打印出来的信息包含对象名和内存地址,如下
object = <Object: 0xh3u8wuh3e763>
这种日志信息作用非常有限,无法看到看到对象的属性信息。想要看到更多的日志信息,那就要自己动手实现了。
description方法
我们在打印日志的时候,实际上都是调用了对象的description
方法,那么想要输出我们想要的日志信息,对这个方法下点功夫就可以了。
debugDescription方法
debugDescription
方法同description
,都是用来打印日志的,不同的是,debugDescription
方法底层实现中调用的description
方法,且debugDescription
只有在调试器中打印时才会调用。
实践
了解了日志打印的方法调用原理,那么我们来动动手。
我们项目中model
类是比较常用个数据处理的类,但是经常调试打印的时候看不到属性信息,所以我们来重写一下debugDescription
方法,这样可以在调试器看到具体的属性。
@implementation AJModel
- (NSString *)debugDescription {
NSString *desc = [NSString stringWithFormat:@"\n<%@ : %p>\n\n", self.ajClassName, self];
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (int i = 0; i < outCount; i ++) {
objc_property_t property = properties[i];
const char * propName = property_getName(property);
if (!propName) {
continue;
}
NSString *prop = [NSString stringWithCString:propName encoding:[NSString defaultCStringEncoding]];
id obj = [self valueForKey:prop];
desc = [desc stringByAppendingFormat:@"%@ : %@;\n", prop, obj];
}
desc = [desc stringByAppendingFormat:@"\n<%@ : %p>\n", self.ajClassName, self];
free(properties);
return desc;
}
@end
AJModel
类是项目中Model
类的基类,好处就是所有AJModel
的子类都继承了这个特性。
网友评论