什么是runtime?
runtime 一套c/c++、汇编形成的API,为Objective-C提供运行时功能。能够将数据类型的确定由编译期推迟到运行时。
ro: read-only在编译期就确定
rw: read-write在运行时确定
如:extension和category的区别
extension在编译期就作为类的一部分直接编译,数据就已经写入ro。
方法的本质是什么?
方法的本质是发送消息。发送消息有以下几个流程:
- 快速查找
(objc_msgSend),从缓存(cache_t)中查找 - 慢速查找,递归
self、super,lookUpImpOrForward - 找不到方法,动态方法解析
+ (BOOL)resolveInstanceMethod:(SEL)sel
+ (BOOL)resolveClassMethod:(SEL)sel
- 消息转发
- (id)forwardingTargetForSelector:(SEL)aSelector
- 消息签名、分发
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
SEL是什么?IMP是什么?两者有什么联系?
SEL是方法编号,即方法名称,在dyld加载镜像时,通过read_image方法加载到内存的表中了
IMP 是函数实现指针,找IMP就是找函数的过程