mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: 内容
This commit is contained in:
@@ -90,4 +90,28 @@ BClass initialize
|
||||
|
||||
|
||||
TagPointerString 不走消息转发
|
||||
CFString 走消息转发
|
||||
CFString 走消息转发
|
||||
|
||||
Objective-C 方法调用则先通过对象的 isa 找到类对象,然后根据类对象的 cache_t 查找方法缓存列表,根据 sel mask 去计算 index,这个 index 代表当前方法缓存在哈希表中的下标索引。 sel 比较,如果没命中,则继续走 objc_msgSend_uncached 流程。
|
||||
|
||||
1ookUpImpOrForward : 1. 当前类对象中的方法列表中遍历方法列表;2. 继承链中 superClass 遍历查找,一直到根部 NSObject;3. 动态特性:
|
||||
- 动态方法解析,动态的添加一个方法,在方法列表中新建一个 SEL 和对应的 IMP (resolveInstanceMethod、resolveClassMethod)
|
||||
|
||||
- 重定向 ` - (id)forwardingTargetForSelector:(SEL)aSelector`
|
||||
|
||||
```
|
||||
- (id)forwardingTargetForSelector:(SEL)aSelector
|
||||
{
|
||||
if(aSelector == @selector(mysteriousMethod:)){
|
||||
return alternateObject;
|
||||
}
|
||||
return [super forwardingTargetForSelector:aSelector];
|
||||
}
|
||||
```
|
||||
如果此方法返回 nil 或者 self,则会进入下一步
|
||||
|
||||
- 消息重定向:`methodSignatureForSelector` 获取函数的参数和返回值类型
|
||||
如果 methodSignatureForSelector: 返回了一个 NSMethodSignature 对象(函数签名),Runtime 系统就会创建一个 NSInvocation 对象,并通过 forwardInvocation: 消息通知当前对象,给予此次消息发送最后一次寻找 IMP 的机会。
|
||||
|
||||
如果 methodSignatureForSelector: 返回 nil。则 Runtime 系统会发出 doesNotRecognizeSelector: 消息,程序也就崩溃了。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user