iOS-runtime__运行时机制—概述

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

// 取得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;

}

你可能感兴趣的:(iOS-runtime__运行时机制—概述)