Objective-C方法如何引用调用它的对象?

时间:2009-09-28 13:27:00

标签: objective-c methods invoke

这很简单,让我发疯,我找不到答案。

方法如何引用调用它的实例?

示例:在某种alpha类方法中,我有“[bravo charley]”

我想让charley方法做“[alpha-instance delta];”用特殊的alpha实例做了“[bravo charley]”。但查理对alpha或其实例一无所知。

换句话说,如何从alpha-instance中的方法调用的charley方法中获取对alpha-instance的引用?

我可以做类似

的事情
in bravo.h:
    -(id) charley:(id)invoker;
in alpha.m:
    [bravo charley:self];

然后“[invoker delta];”在查理方法中,但这看起来很难看。

2 个答案:

答案 0 :(得分:11)

实现此目的的常用习惯是传递一个名为sender的参数和消息,或多或少类似于您的示例。这是例如如何指定绑定为用户界面动作的方法 - 例如

-(IBAction)doTheThing:(id)sender

没有内置的方法来获取发送消息的对象,而且很少需要它。

答案 1 :(得分:1)

为了澄清,一个方法可能并不总是被另一个对象调用,因此运行时无论如何都无法可靠地提供这些信息。例如,


int main (int argc, char *argv[])
{
    SEL releaserSel = @selector(release);

    NSObject *someObject = [[NSObject alloc] init];

    IMP releaserImp = [someObject methodForSelector:releaserSel];

    releaserImp (someObject, releaserSel);

    // someObject has been released!
    return 0;
}

这可能不像你想象的那么罕见。直接调用方法比发送消息要快得多(这有助于在同一个消息被反复发送到同一个对象的情况下)。