iOS Runtime详解(新手也看得懂)
什么是Runtime?
Runtime是指在运行时进行操作的能力。在iOS开发中,Runtime是一种基于C语言的API,它可以动态地创建类、对象和修改类的属性和方法等。其主要的作用是在编译阶段之外,给我们提供了对类和对象的管理。
Runtime的应用场景
- 动态给类添加属性(associative reference)
- 动态添加方法、替换方法、获取方法、交换方法
- 发送消息(Objective-C中调用方法的方式实际上就是向接收者发送消息)
- 获取类名、获取父类、获取实例变量数量和列表、获取属性列表
- 实现分类的原理
Runtime的使用方法
1. 动态添加属性
我们都知道,在Objective-C中,类的属性是在.h文件或者.m文件的@property中定义的。但是,有时候我们需要在运行时动态地添加一些属性,这时我们就需要使用Runtime创建关联的Properties。
#import <objc/runtime.h>
static char kAssociatedObjectKey;
@interface Person : NSObject
@end
@implementation Person
- (void)setAssociatedObject:(id)object {
objc_setAssociatedObject(self, &kAssociatedObjectKey, object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id)associatedObject {
return objc_getAssociatedObject(self, &kAssociatedObjectKey);
}
@end
在上面的例子中,我们利用Runtime给Person类动态地添加了一个关联属性associatedObject,它可以在该类的实例中存储任意类型的对象。
2. 动态添加方法
有时我们需要在运行时动态地给类添加一个方法,这时我们就可以使用Runtime中的class_addMethod方法。
#import "Person.h"
#import <objc/runtime.h>
void greet(id self, SEL _cmd) {
NSLog(@"Hello, World!");
}
@implementation Person
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == @selector(greet)) {
class_addMethod([self class], sel, (IMP)greet, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
@end
在上述例子中,我们通过使用Runtime的class_addMethod方法,在Person类中动态地添加了一个greet方法。
3. 方法的交换
有时候我们需要在一个已有的方法中增加一些功能,这时我们可以使用方法交换的方式实现。在Objective-C中,方法交换的实现是通过Runtime中的method_exchangeImplementations函数来实现的。
我们可以通过方法交换,实现替换系统方法,比如系统的viewDidLoad方法,我们可以在其中添加一些我们自定义的代码。
#import "UIViewController+Logger.h"
#import <objc/runtime.h>
@implementation UIViewController (Logger)
+ (void)load {
Method viewDidAppear = class_getInstanceMethod(self, @selector(viewDidAppear:));
Method logViewDidAppear = class_getInstanceMethod(self, @selector(logViewDidAppear));
method_exchangeImplementations(viewDidAppear, logViewDidAppear);
}
- (void)logViewDidAppear {
NSLog(@"%@%@",@"当前ViewController的类名为:",NSStringFromClass([self class]));
// 此处还可以添加一些埋点相关的代码
[self logViewDidAppear];
}
@end
在上述例子中,我们通过方法交换的方式,实现了对系统UIViewController中viewDidAppear方法的替换,从而可以在该方法中输出当前ViewController的类名,并且还可以添加一些埋点相关的代码。
结论
Runtime是iOS开发中一个非常重要的概念,它可以让我们实现一些非常有意思的功能,如动态增加属性、动态实现方法交换等。学好使用Runtime,将让我们的代码更加灵活,可维护性和可扩展性也会更好。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS Runtime详解(新手也看得懂) - Python技术站