是什么导致此代码中的"错过方法"?

Jam*_*ier 2 iphone objective-c ios4 ios

如果这是一个完全偏离标记的问题,或者如果我没有包含足够的信息,我会提前道歉 - 我对iOS开发(和Objective-C)很新,并且有进入深层的习惯结束...

我无法理解GameCenterManager.m中的"callDelegate"代码,该代码位于GKTapper示例代码中,并在此tuts +教程中提供:http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-game-center -achievements和-排行榜部分-2 /

这是代码:

- (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
    assert([NSThread isMainThread]);
    if([delegate respondsToSelector: selector])
    {
        if(arg != NULL)
        {
            [delegate performSelector: selector withObject: arg withObject: err];
        }
        else
        {
            [delegate performSelector: selector withObject: err];
        }
    }
    else
    {
        NSLog(@"Missed Method");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的应用程序总是记录"Missed Method"行,但我不确定这个callDelegate代码实际上在做什么(所以我无法修复它).我认为最好的方法是学习它实际上在做什么,并获得比'Missed Method'更好的输出......

需要注意的是,我的应用程序目前正在沙盒模式下使用Game Center,因为我还在开发它.在这种情况下可能会出现这种"错过的方法"线 - 我也不确定.

是否有人能够将此代码翻译成段落形式?我特别不确定'[delegate respondsToSelector:selector]'作品.

或者,是否有人能够重写NSLog行,以便输出更多/相关的问题细节?我试过这个希望看到哪个选择器没有正确地通过'respondsToSelector',但它似乎不起作用:

NSLog(@"Missed Method, %@", selector);
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 5

看看究竟发生了什么的最好方法是在callDelegate的开头放置一个断点,然后调试你的程序,而不是简单地运行它.您可以按cmd-y进行调试.

这样做,每次程序进入callDelegate函数时,它都会停止并弹出调试器窗口.在那里,您将能够检查呼叫的来源以及参数.

至于这个函数的简单描述,我会说它是一个辅助函数,通过在它前面检查该选择器的存在来包装对选择器的调用.您可以调用辅助函数来代替每次检查和执行选择器,它将为您执行这两项操作.

所以,你总是看到日志行的原因是你想要调用的函数不存在.通过使用调试器,您将能够看到它是哪个函数,哪个类缺少它,以及谁尝试了该操作.