runtime总结

2019-10-08  本文已影响0人  醉叶惜秋

1.什么是运行时

1>运行时是套纯C语言的API(纯C语言库)
2>编译器最终都会将OC代码转化为运行时代码
3>利用运行时,可以做很多底层的工作,比如

2.如何应用运行时?

a>将某些OC代码转为运行时代码,探究底层,比如block的实现原理
block实现原理:
b> 拦截系统自带的方法调用,比如拦截imageNamed,viewdidLoad alloc方法
c>实现字典和模型的自动转换
d>能实现分类也可以增加属性

//首先定义一个全局变量,用它的地址作为关联对象的key
static char associatedObjectKey;
//设置关联对象
objc_setAssociatedObject(target, &associatedObjectKey, @"添加的字符串属性", OBJC_ASSOCIATION_RETAIN_NONATOMIC); //获取关联对象
NSString *string = objc_getAssociatedObject(target, &associatedObjectKey);
NSLog(@"AssociatedObject = %@", string);
image.png

e>获取某个类的所有成员变量

image.png

3.运行时常用的函数

 Method class_getInstanceMethod([self class], systemSel);
Method  class_getInstanceMethod([self class], swizzSel);
method_exchangeImplementations(systemMethod, swizzMethod);
objc_setAssociatedObject(id object, const void *key, id vaule, objc_AssociationPolicy policy)

objc_setAssociatedObject的四个参数:
id object给谁设置关联对象。
const void *key关联对象唯一的key,获取时会用到。
id value关联对象。
objc_AssociationPolicy关联策略,有以下几种策略:
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};

objc_getAssociatedObject的两个参数。
id object获取谁的关联对象。
const void *key根据这个唯一的key获取关联对象。
其实,你还可以把添加和获取关联对象的方法写在你需要用到这个功能的类的类别中,方便使用。

//添加关联对象
- (void)addAssociatedObject:(id)object{
    objc_setAssociatedObject(self, @selector(getAssociatedObject), object, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//获取关联对象
- (id)getAssociatedObject{
    return objc_getAssociatedObject(self, _cmd);
objc_msgSend(target, @selector(doSomething))
上一篇 下一篇

猜你喜欢

热点阅读