Runtime的作用
- 获取类的私有变量
#import <objc/runtime.h>
// 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);
}
- 动态产生类,成员变量和方法
- 动态修改类,成员变量和方法
- 对换两个方法的实现(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;
}
```