Runtime的概念
1、Runtime是一套底层的C语言API(包含强大的C语言数据类型和函数)
2、OC代码都是基于Runtime实现的,即编写的OC代码最终都会转成Runtime的代码,
例如:
HCPerson *person = [HCPerson alloc] init];
[person setAge:10]; //这句会转换成
objc_msgSend(person,@selector(setAge:),20);
Runtime的作用
1、获取类的私有变量
#import// Ivar : 成员变量
unsigned int count = 0;
// 获得所有的成员变量
Ivar *ivars = class_copyIvarList([HCPerson class], &count);
for (int i = 0; i<count;i++){
// 取得i位置的成员变量�
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
const char *type = ivar_getTypeEncoding(ivar);
NSLog(@"%d %s %s", i, name, type);
}
2、动态产生类,成员变量和方法
3、动态修改类,成员变量和方法
4、对换两个方法的实现(swizzle)
例如:如果想要对iOS7以上和iOS7以下的图片进行适配,不同系统版本显示不同的图片,则可利用swizzle来实现
实现方法:
1.自定义UIImage的类imageWithName:方法,在该方法内进行系统版本号的判断,来显示不同的图片
2.将imageWithName:方法和系统的imageNamed:方法进行对换,这样,一旦调用系统的imageNamed:方法,便会执行自定义的imageWithName:方法,进行判断,显示不同的图片
/**
* 只要分类被装载到内存中,就会调用1次
*/
+ (void)load
{
//获取类方法
Method otherMehtod = class_getClassMethod(self, @selector(imageWithName:));
Method originMehtod = class_getClassMethod(self, @selector(imageNamed:));
// 交换2个方法的实现
method_exchangeImplementations(otherMehtod, originMehtod);
}
+ (UIImage *)imageWithName:(NSString *)name
{
BOOL iOS7 = [[UIDevice currentDevice].systemVersion floatValue] >= 7.0;
UIImage *image = nil;
if (iOS7) {
NSString *newName = [name stringByAppendingString:@"_os7"];
image = [UIImage imageWithName:newName];
}
if (image == nil) {
image = [UIImage imageWithName:name];
}
return image;
}