iOS 关于runtime的初步认识

释放双眼,带上耳机,听听看~!

一、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);
}

人已赞赏
iOS文章

iOS OC内存管理机制

2020-3-29 17:48:01

iOS文章

iOS PCH文件的使用方法

2020-3-29 19:04:36

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索