导入#import <objc/runtime.h>
一、获取类
OBJC_EXPORT Class _Nullable object_getClass(id _Nullable obj)
返回值是类名称
```
Class zr = object_getClass([[ZRObject alloc] init]);
```
二、获取类方法
OBJC_EXPORT Method _Nullable class_getClassMethod(Class _Nullable cls, SEL _Nonnull name)
参数
cls :类名
name: 方法名
```
Method classMethod = class_getClassMethod([self class],@selector(classMethodImplementation));
```
三.获取实例方法
OBJC_EXPORT Method _Nullable class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
参数
cls :类名
name: 方法名
```
Method objMethod = class_getInstanceMethod([self class], @selector(instancesMethodImplementation));
```
四.添加方法
OBJC_EXPORT BOOL class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp,
const char * _Nullable types)
参数
cls :所要添加对象的类名
name: 所要添加方法的方法名
imp:已实现放的IMP指针
types:定义该函数返回值类型和参数类型的字符串
1、IMP 是指向方法的实现地址的函数指针
获取IMP方法
OBJC_EXPORT IMP _Nullable class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name)
- (IMP)methodForSelector:(SEL)aSelector;
```
IMP first = class_getMethodImplementation([self class], @selector(addThisMethod));
IMP second = [self methodForSelector:@selector(addThisMethod)];
// 调用addThisMethod 可以直接通过IMP 指针调用 first();
/*
types参数为"i@:@“,按顺序分别表示:
i:返回值类型int,若是v则表示void
@:参数id(self)
::SEL(_cmd)
@:id(str)
*/
class_addMethod([ZRObject class], @selector(reallyAddName),first, "v@:");
```
五.方法交换
OBJC_EXPORT void method_exchangeImplementations(Method _Nonnull m1, Method _Nonnull m2)
参数
m1 :交换的方法,可用上面的类方法,实例方法函数获取
m2: 交换的方法,可用上面的类方法,实例方法函数获取
```
method_exchangeImplementations(objFirstMethod,objSecondMethod);
```
demo地址:https://github.com/liuZhengR/runtime#runtime