NSObject之扩展方法-获取属性类型以及数值
方法一: 获取对象中所有的属性的数据类型, 返回一个NSDictionary,key对象的属性名,value对应的是该属性的数据类型。
/**
Description: Return a dictionary which made up by property names and attributes from a given property list.
*/
+ (NSDictionary *)propertyNamesAttrDictionary {
NSMutableDictionary *propDict = [NSMutableDictionary dictionary];
unsigned int outCount, i;
objc_property_t *objProperties = class_copyPropertyList([self class], &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = objProperties[i];
const char *propName = property_getName(property);
if (propName) {
const char *propAttr = property_getAttributes(property);
NSString *propertyName = [NSString stringWithCString:propName encoding:NSUTF8StringEncoding];
NSString *propertyAttr = [NSString stringWithCString:propAttr encoding:NSUTF8StringEncoding];
[propDict setObject:[[self class] typeFromAttributes:propertyAttr] forKey:propertyName];
}
}
free(objProperties);
return [NSDictionary dictionaryWithDictionary:propDict];
}
方法二: 获取对象中所有的属性的值, 返回一个NSDictionary,key对象的属性名,value对应的是该属性的值。
/**
Description: Return a dictionary which made up by a given property list object.
*/
- (NSDictionary *)propertyValuesDictionary {
Class selfClass = [self class];
u_int count;
objc_property_t *properties = class_copyPropertyList(selfClass, &count);
NSMutableDictionary *propertyDictionary = [NSMutableDictionary dictionaryWithCapacity:count];
for (int i = 0; i < count; i++) {
const char *propertyName = property_getName(properties[i]);
NSString *key = [NSString stringWithCString:propertyName encoding:NSASCIIStringEncoding];
@try {
id value = [self valueForKey:key];
if (value)
[propertyDictionary setObject:value forKey:key];
} @catch (NSException *exception) {
// Avoid crash
}
}
free(properties);
return [NSDictionary dictionaryWithDictionary:propertyDictionary];
}