1

这太简单了,它让我发疯,我找不到答案。

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

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

我想让 charley 方法执行“[alpha-instance delta];” 使用执行“[bravo charley]”的特定 alpha 实例。但 charley 对 alpha 或其实例一无所知。

换句话说,我怎样才能从由 alpha-instance 中的方法调用的 charley 方法中获取对 alpha-instance 的引用?

我可以做类似的事情

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

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

4

2 回答 2

11

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

-(IBAction)doTheThing:(id)sender

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

于 2009-09-28T13:30:09.537 回答
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;
}

它可能并不像你想象的那么罕见。直接调用方法比发送消息要快得多(它有助于将同一消息一遍又一遍地发送到同一个对象的情况)。

于 2009-09-28T21:54:08.257 回答