Runtime是什么
- Runtime是属于OC的底层,是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API,可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)。
- Runtime的核心即为消息机制,在程序运行时动态发送消息。
消息传递过程
- 首先,通过 obj 的
isa
指针找到它的 class; - 注册方法编号;
- 根据方法编号去方法列表里查找对应的方法函数实现地址;
- 如果该类中没找到,继续往它的 superclass 中找;
- 一旦找到对应的函数,就根据地址去方法区调用对应函数实现IMP;
- 如果没有找到对应的方法实现,OC的运行时会给三个拯救机会;
// 1.拯救实例方法
+ (BOOL)resolveInstanceMethod:(SEL)sel {
return [super resolveInstanceMethod:sel];
}
// 2.如果上一个方法返回 NO ,运行时就会移到下一步:
// 消息转发
- (id)forwardingTargetForSelector:(SEL)aSelector {
return [super forwardingTargetForSelector:aSelector];
}
// 3.如果上一个方法还是没有实现,那还有最后一次拯救机会:
// 3.1.首先它会发送该消息获得函数的参数和返回值类型。
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
NSMethodSignature *signature = [super methodSignatureForSelector:aSelector];
return signature;
}
// 3.2.如果上一个方法返回 nil ,Runtime 则会发出该方法,程序这时也就挂掉了。
- (void)doesNotRecognizeSelector:(SEL)aSelector {
}
// 3.3.如果返回了一个函数签名,Runtime 就会发出该方法。
- (void)forwardInvocation:(NSInvocation *)anInvocation {
}
常用Runtime函数
- 头文件 :
<objc/runtime.h>
<objc/message.h>
- 发送消息:
objc_msgSend(class, sel)
- 获取一个SEL的方法:
sel_registerName("alloc")
@selector(alloc)
- 获取类:
objc_getClass("NSObject")
- 获取类方法:
class_getClassMethod(Class cls , SEL name)
- 获取对象方法:
class_getInstanceMethod(Class cls , SEL name)
- 交换两个方法:
method_exchangeImplementations(method1, method2);
- 增加方法:
class_addMethod(self, sel, (IMP)method1, "v@");
- 替换原方法实现:
class_replaceMethod(Class cls, SEL name, imp, type)
- 增加属性(setter):
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- 获取属性():
objc_getAssociatedObject(self, @"name")
- 获取成员变量列表:
class_copyIvarList(self, &count)
- 获取属性列表:
class_copyPropertyList(self, &count)
- 获取方法列表:
class_copyMethodList(self, &count)
- 获取协议列表:
class_copyProtocolList(self, &count)
参考文章链接:
http://tech.glowing.com/cn/objective-c-runtime/
http://blog.csdn.net/coyote1994/article/details/52355026
网友评论