美文网首页
实现description方法

实现description方法

作者: bug工程狮 | 来源:发表于2020-06-12 08:31 被阅读0次

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

    相关文章

      网友评论

          本文标题:实现description方法

          本文链接:https://www.haomeiwen.com/subject/sgnwtktx.html