mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
36 lines
1.5 KiB
C
36 lines
1.5 KiB
C
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);
|
|
}
|