iOS开发系列-Runtime

概述

调用runtime方法需要导入都文件#import <objc/runtime.h>

常用的函数

// 获取一个类的Class类型(类对象)
objc_getClass(const char * _Nonnull name)

// 获取函数的IMP
class_getMethodImplementation(Class cls,  SEL name)

// 获取对象某个方法
Method method = class_getInstanceMethod(Class cls, SEL  name)

// 获取类的某个方法
Method method = class_getClassMethod(Class cls, SEL  name);

// 交换方法
method_exchangeImplementations(Method  _Nonnull m1, Method  _Nonnull m2)

// 动态给类添加方法
class_addMethod(Class cls, SEL name, IMP imp, const char *  types);

// 获取类的成员
class_copyIvarList(Class cls, unsigned int * outCount);

利用类扩展给对象添加属性

在类扩展中给类添加属性,默认只会生成属性的getter与setter方法声明,不会生成方法实现和带下划线成员变量
示例: 给UIView添加一个NSDictinonary和flag属性 ,flag为BooL类型,作为基本类型属性的代表

#import <UIKit/UIKit.h>

@interface UIView (Example)

// 动态添加基本数据类型成员变量
@property (nonatomic, assign) BOOL flag;

// 动态添加对象类型成员变量
@property (nonatomic, strong) NSDictionary *dict;
@end

#import "UIView+Example.h"
#import <objc/runtime.h>

@implementation UIView (Example)
/***************************动态添加基本数据类型成员变量***************************/
- (void)setFlag:(BOOL)flag
{
    // 注意:参数二 需要传递一个key 这里建议用@selector(属性名),不用定义很多常量
    objc_setAssociatedObject(self, @selector(flag), @(flag), OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)flag
{
    id object = objc_getAssociatedObject(self, @selector(flag));
    return object?[object boolValue]: NO;
}

/***************************动态添加对象类型成员变量***************************/
-(void)setDict:(NSDictionary *)dict
{
    objc_setAssociatedObject(self, @selector(dict), dict, OBJC_ASSOCIATION_RETAIN);
}

- (NSDictionary *)dict
{
    return objc_getAssociatedObject(self, @selector(dict));
}
@end

动态添加方法

猜你喜欢

转载自www.cnblogs.com/CoderHong/p/9431763.html