是否可以使用Objective-C运行时功能来确定调用方法的位置?

e.J*_*mes 6 methods runtime introspection objective-c

当一个对象在另一个对象上调用方法时,Objective-C使用复杂的消息传递系统.我想知道在被调用的方法中是否有可能确定调用对象是什么?

例如:

@implementation callingClass
- (void)performTest
{
    calledObject = [[[calledClass alloc] init] autorelease];
    id result = [calledObject calledMethod];

    assert(result == this);
}
@end

@implementation calledClass
- (id)calledMethod
{
    id objectThatCalledThisMethod = ... // <-- what goes here?

    return objectThatCalledThisMethod;
}
@end
Run Code Online (Sandbox Code Playgroud)

我可以在注释行中写什么,以便在执行时使断言通过performTest

Chu*_*uck 11

不是运行时.所有消息发送最终都可以通过函数调用objc_msgSend(id receiver, SEL selector, /*method arguments*/...).如您所见,没有传递有关发送消息的对象的信息.通过遍历堆栈来确定调用对象可能是可能的,但这种方式就是疯狂.告诉谁调用该方法的唯一实用方法是给它一个sender像所有IBAction方法一样的参数.