OC--Runtime基本用法《一》
程序员文章站
2022-04-13 12:25:36
...
由于苹果不是开源的,当我们使用一些系统的框架活着控件的时候往往由于接口太少不能实现所有的产品需求,那么这时候Runtime就用上了,我们通过Runtime系统的运行和方法,可以在运行时获取到系统内部的成员变量、方法、属性、所遵守的协议1、获取OC中的控件的成员变量---UIButton,如图
、
可以看到他的属性,而我们通过名字应该不难猜到他们的作用,这时我们可以通过KVC来修改某个成员变量的值,更多KVC见KVC学习
MJExtension实现字典转模型原理
//Person是一个模型;Model
Person * personModel = [[Person alloc]init];
NSDictionary * modelDict;
unsigned int modelCount = 0;
Ivar * modelIvarName = class_copyIvarList([Person class], &modelCount);
//遍历model中的属性
for (int i = 0; i < modelCount; i++) {
Ivar var = modelIvarName[i];
//获取属性的名字
const char * ivarName = ivar_getName(var);
//获取属性类型
const char * ivarCoding = ivar_getTypeEncoding(var);
// 如果检测到属性类型不为基础值,也就是说模型中还嵌套模型,
// 则继续遍历模型,通过递归一层一层,找出所有模型的所有属性并赋值。
//c --> oc的字符串
NSString * ocIvar = [NSString stringWithUTF8String:ivarName];
//Json解析的字典中的值 与 模型一一对应赋值 运行时遍历Json字典
[personModel setValue:modelDict[ocIvar] forKey:ocIvar];
}
黑魔法:method swizzle
作为一个苦逼的iOS开发,由于苹果每年都会发布新的系统和屏幕尺寸,比如iOS6和iOS7,由于iOS6的图片是立体的,iOS7的是扁平化的,因此我们需要兼容iOS7和iOS6的图片,但在项目中我们一样用自带的imageNamed方法,我们可以写一个Image的扩展来实现自己的方法,相信这部分代码大家都会写。但我们最关键的一步就是在分类中一开始就加载到内存中的时候我们必须让runtime系统知道一件事,那就是系统的imageNamed方法已经被我们更改成自己的方法了就需要实现+(void)load方法
+(void)load{
Method originalM = class_getClassMethod(self,@selector(imageNamed:));
method ourM = class_getClassMethod(self,@selector(my_imageNamed:))
Method_exchangeImplementations(originalM,ourM);
}
//自己的image的方法
-(UIImage *)myImageNamed:(NSString *)imageName{
if([[UIDevice currentDevice].systemVersion floatValue] >= 7.0)
{
UIImage = [];
}else{
}
return image;
}