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