runtime 学习一

导入#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值