释放双眼,带上耳机,听听看~!
一、runtime简介
Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。
二、runtime的用途
动态修改属性值
动态添加属性
动态添加方法
动态交换方法
三、详细的代码实现过程
3.1动态更改属性值
使用runtime修改一个对象的属性值
- (IBAction)changeProprety:(id)sender {
unsigned int count = 0;
//动态获取类中的所有属性(包括私有)
Ivar *ivar = class_copyIvarList(_person.class, &count);
for (int i = 0; i < count; i++) {
Ivar tempIvar = ivar[i];
const char *varChat = ivar_getName(tempIvar);
NSString *varString = [NSString stringWithUTF8String:varChat];
if ([varString isEqualToString:@"_name"]) {
//修改对应的属性值
object_setIvar(_person, tempIvar, @"这是更改后的新值");
break;
}
}
self.nameLabel.text = _person.name;
}
3.2在分类中动态添加一个属性
首先新建一个分类NSObject+HQAddProprety,在.h文件中添加一下代码
@interface NSObject (HQAddProprety)
@property (nonatomic, assign) NSString *name;
@end
在.m文件中添加关键的属性关联的代码
- (void)setName:(NSString *)name {
/**
*关联对象的方法,有四个参数
*1.被关联的对象,即原对象
*2.要关联的对象的键值,一般设置成静态的
*3.关联的对象
*4.关联时采用的协议 指的是weak strong copy nonatomic
*/
objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, &nameKey);
}
使用:在目标文件中导入#import “NSObject+HQAddProprety.h”,这样NSObject 就拥有了一个name的属性
NSObject *object = [NSObject new];
object.name = @"我是分类中动态添加的属性";
self.nameLabel.text = object.name;
3.3动态添加方法
- (IBAction)addMethod:(id)sender {
/**
*动态添加方法,有四个参数
*1.添加新方法的那个类
*2.要添加的方法
*3.指向实现方法的指针,就是要添加的方法的实现部分
*4.添加方法的返回值与参数
*/
class_addMethod([HQPerson class], @selector(eat), (IMP)study, "v@:");
// 调用 coding 方法响应事件
if ([_person respondsToSelector:@selector(eat)]) {
[_person performSelector:@selector(eat)];
self.nameLabel.text = @"添加方法成功";
} else {
self.nameLabel.text = @"添加方法失败";
}
//调用方法
[_person performSelector:@selector(eat)];
}
3.4动态交换方法
- (IBAction)exchangeMothod:(id)sender {
Method oriMethod = class_getInstanceMethod([_person class], @selector(work));
Method curMethod = class_getInstanceMethod([_person class], @selector(sleep));
method_exchangeImplementations(oriMethod, curMethod);
}