zoukankan      html  css  js  c++  java
  • 【iOS】desctiption和debugDescription

    一、简介

      与.NET一样,在.NET上得Object对象有个ToString()方法可以用于输出对象的信息,在iOS上的NSObject也有一个方法,为description,该方法返回objc对象的描述信息,当我们调用NSLog打印一个对象或者NSString格式化输出一个对象的时候,就会调用该方法,NSObject还有另一个方法debugDescription,用于在调试控制台输出信息(在控制台输出对象信息如:po person),默认情况下debugDescription调用的时description方法

    二、演示

    @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对象只输出对象名字和对象的地址,默认的实现应该是这样的

    - (NSString *)description
    {
        return [NSString stringWithFormat:@"<%@: %p>", NSStringFromClass([self class]), self];
    }

    一般这两个信息对于我们调试没太大帮助,通常我们希望看到类的更多属性的信息,我们可以重写description方法

    @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> {
    	name=%@,
    	age=%ld,
    	weight=%f,
    	gender=%lu
    }", self, self.name, self.age, self.weight, self.gender];
    }
    
    @end

    输出下面信息

    三、抽象基类

      从上面看到,如果我们要为每个model都重写description方法,那就太费劲了,程序员都是很懒的,其实我们可以封装一个通用的方法,通过运行时的API动态获取到对象的类型,并输出,该方法可以给所有的类通用

    这里创建一个基类BaseModel,我们在基类实现一个通用的description方法(除了基类的方式,我们也可以重写NSObject的description方法,应为基本上所有的类都集成自NSObject,我们不能拿到NSObject的源代码,objc提供了一种叫method swizzling技术,可以在运行时替换两个方法的实现,我们可以吧NSObject的description换成我们的实现,详情参见:http://www.cnblogs.com/bomo/p/4693363.html

    @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的输出,这里是利用的字典的输出,就不用自己拼字符串

    我们也可以只重写debugDescription方法,在调试控制台输出的时候才输出类的所有属性信息,而description保留默认的实现

  • 相关阅读:
    洛谷P3768 简单的数学题 【莫比乌斯反演 + 杜教筛】
    13.1.2 拷贝赋值运算符、析构函数、三/五法则、阻止拷贝
    拷贝构造函数和深拷贝例子
    拷贝构造函数和深拷贝例子
    动态数组、allocator 类
    智能指针和异常、 weak_ptr、unique_ptr
    12.动态内存和智能指针、 直接管理内存、shared_ptr和new结合使用
    8.2 文件输入输出
    7.3 类的其他特性 笔记
    8.1.1 IO
  • 原文地址:https://www.cnblogs.com/bomo/p/4811906.html
Copyright © 2011-2022 走看看