什么是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
就是找函数的过程