美文网首页iOS进阶项目搭建
runtime小技巧-实现BaseModel的descripti

runtime小技巧-实现BaseModel的descripti

作者: YM_1 | 来源:发表于2016-03-08 15:49 被阅读90次

    description方法是可以开发者自定义的,返回该对象实例的描述,但去重写每一个类的description方法太繁琐了,于是我就自己实现了一个BaseModel作为所有model的基类,利用runtime动态的获取当前实例的所有属性名称和值,

    /*
     *利用runtime打印所有的属性名称和值
     */
    - (NSString *)description{
        
        NSString *descriptionString = NSStringFromClass([self class]);
        Class tempClass = [self class];
        //循环执行 直到父类循环到 NSObject 为止
        while (tempClass != [NSObject class]) {
            unsigned int count = 0 ;
            //获取属性列表
            objc_property_t *propertyList = class_copyPropertyList(tempClass, &count);
            
            for (int i = 0; i < count; i ++) {
                //取出属性名和值 拼接字符串。
                objc_property_t property = propertyList[i];
                NSString *propertyName = [NSString stringWithUTF8String: property_getName(property)];
                
                NSString *propertyValue = [self valueForKey:propertyName];
                
                NSString *keyValueDic = [NSString stringWithFormat:@" %@--%@, ",propertyName,propertyValue];
                
                descriptionString = [descriptionString stringByAppendingString:keyValueDic];
            }
            free(propertyList);
            //释放指针
            tempClass = [tempClass superclass];
            //指向父类
        }
        return descriptionString;
    }
    
    

    这里说一下循环遍历父类的属性列表的原因,如果只是遍历当前Class对象的属性列表,只能显示出当前类添加的属性,并不能体现出类本身的所有属性。到NSObject对象为止,因为到NSObject这一层,我们把我们自己定义的所有属性都拿到了,算是一个截止点。

    相关文章

      网友评论

        本文标题:runtime小技巧-实现BaseModel的descripti

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