mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
docs: refine
This commit is contained in:
35
assets/__forwarding__clean.c
Normal file
35
assets/__forwarding__clean.c
Normal file
@@ -0,0 +1,35 @@
|
||||
int __forwarding__(void *frameStackPointer, int isStret) {
|
||||
id receiver = *(id *)frameStackPointer;
|
||||
SEL sel = *(SEL *)(frameStackPointer + 8);
|
||||
const char *selName = sel_getName(sel);
|
||||
Class receiverClass = object_getClass(receiver);
|
||||
|
||||
// 调用 forwardingTargetForSelector:
|
||||
if (class_respondsToSelector(receiverClass, @selector(forwardingTargetForSelector:))) {
|
||||
id forwardingTarget = [receiver forwardingTargetForSelector:sel];
|
||||
if (forwardingTarget && forwardingTarget != receiver) {
|
||||
return objc_msgSend(forwardingTarget, sel, ...);
|
||||
}
|
||||
}
|
||||
|
||||
// 调用 methodSignatureForSelector 获取方法签名后再调用 forwardInvocation
|
||||
if (class_respondsToSelector(receiverClass, @selector(methodSignatureForSelector:))) {
|
||||
NSMethodSignature *methodSignature = [receiver methodSignatureForSelector:sel];
|
||||
if (methodSignature && class_respondsToSelector(receiverClass, @selector(forwardInvocation:))) {
|
||||
NSInvocation *invocation = [NSInvocation _invocationWithMethodSignature:methodSignature frame:frameStackPointer];
|
||||
|
||||
[receiver forwardInvocation:invocation];
|
||||
|
||||
void *returnValue = NULL;
|
||||
[invocation getReturnValue:&value];
|
||||
return returnValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (class_respondsToSelector(receiverClass,@selector(doesNotRecognizeSelector:))) {
|
||||
[receiver doesNotRecognizeSelector:sel];
|
||||
}
|
||||
|
||||
// The point of no return.
|
||||
kill(getpid(), 9);
|
||||
}
|
||||
Reference in New Issue
Block a user