runtime小技巧-实现BaseModel的description

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 2,230评论 0 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • 我在想,每一天的味道是不是不一样呢? 也许是的,因为每一天发生的事情都会不一样。和往常一样,我坐在办公的地...
    HS安林阅读 315评论 0 0
  • 开口即是沉默 一阵阵低下的思想 谱写阳光的纸 来自稚幼的鲜血 一半花开是窗外的蓝 一半凋落在夜的衣裳 他们捧着枯萎...
    车前慕阅读 547评论 3 1
  • 合伙人制,确实是知识经济和网络经济时代的趋势。知识资本化,必须得到体现,否则留不住人才。黄院反复强调,创业就是抓住...
    老周巴布阅读 135评论 0 1