运行时:<objc/runtime.h>
方法的调换:
Method m1 = class_getClassMethod([UIImage class], @selector(imageWithName:));
Method m2 = class_getClassMethod([UIImage class], @selector(imageNamed:));
method_exchangeImplementations(m1, m2);
获得类的属性:(不需要模型转换)如下:CZPerson时一个类:
NSDictionary *dict = @{@"name" : @"明月心",
@"age" : @18 ,
@"height" : @"1.8"
};
1 声明属性的个数(假定是0)
unsigned int count = 0;
1.1 类的属性的源数组(相当于一个数组)
Ivar *vars = class_copyIvarList([CZPerson class], &count);
2 遍历属性数组,得到单个源属性(其实是带有属性信息的一个源对象)
for (int i = 0; i < count; i++) {
// 2.1 单个源属性
Ivar var = vars[i];
//2.2 获得c语言的属性名字
const char *name = ivar_getName(var);
//转化为oc格式的属性名字
NSString *result = [NSString stringWithUTF8String:name];
result = [result substringFromIndex:1];
NSLog(@"%@",result);
//kvc 将属性对应的值取出
[person setValue:dict[result] forKey:result];
}
-----------------------------------------------
1 获得公有 私有属性的方法:
- (void)getProperty{
NSMutableArray *properties = [NSMutableArray array];
//我们的一个属性的个数
unsigned int count = 0;//属性的个数
//propertyArray 相当于是一个数组
/**
class_copyIvarList 这个既可以拿到公有属性,也可以拿到私有属性
*/
Ivar *propertyArray = class_copyIvarList([UIPageControl class], &count);
for (int i=0; i<count; i++) {
//获取到类的每一个属性
Ivar ivar = propertyArray[i];
//进一步获取我们属性的名称
const char *cPropertyName = ivar_getName(ivar);
//把C语言中的属性名称转成我们OC的字符串
NSString *propertyName = [[NSString alloc] initWithCString:cPropertyName encoding:NSUTF8StringEncoding];
NSLog(@"????%@",propertyName);
[properties addObject:propertyName];
}
free(propertyArray);
}
2 获得公有属性的方法:
+ (NSArray *)properties{
NSMutableArray *properties = [NSMutableArray array];
//我们的一个属性的个数
unsigned int count = 0;//属性的个数
//propertyArray 相当于是一个数组
objc_property_t *propertyArray = class_copyPropertyList([Cycle class], &count);
for (int i=0; i<count; i++) {
//获取到类的每一个属性
objc_property_t property = propertyArray[i];
//进一步获取我们属性的名称
const char *cPropertyName = property_getName(property);
//把C语言中的属性名称转成我们OC的字符串
NSString *propertyName = [[NSString alloc] initWithCString:cPropertyName encoding:NSUTF8StringEncoding];
NSLog(@"%@",propertyName);
[properties addObject:propertyName];
}
return properties.copy;
}