iOS进阶项目搭建

runtime小技巧-实现BaseModel的descripti

2016-03-08  本文已影响90人  YM_1

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这一层,我们把我们自己定义的所有属性都拿到了,算是一个截止点。

上一篇下一篇

猜你喜欢

热点阅读