实现description方法

2020-06-12  本文已影响0人  bug工程狮

实现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的子类都继承了这个特性。

上一篇下一篇

猜你喜欢

热点阅读