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

时间:2011-06-12 16:59:51

标签: iphone objective-c ios ios4

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

我无法理解GameCenterManager.m中的“callDelegate”代码,该代码位于GKTapper示例代码中,并在此tuts +教程中提供:http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-game-center-achievements-and-leaderboards-part-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");
    }
}

我的应用程序始终记录“Missed Method”行,但我不确定这个callDelegate代码实际上在做什么(所以我无法修复它)。我认为最好的方法是了解它实际上在做什么,并获得比“错过的方法”更好的输出......

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

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

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

NSLog(@"Missed Method, %@", selector);

3 个答案:

答案 0 :(得分:5)

最好的方法是确切地看到正在发生的事情是在callDelegate的开头放置一个断点,然后调试你的程序,而不是简单地运行它。您可以按cmd-y进行调试。

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

至于这个函数的简单描述,我会说它是一个辅助函数,通过在它前面检查该选择器的存在来包装对选择器的调用。而不是检查每次和执行选择器,而是调用辅助函数,它将为您做两件事。

因此,您始终看到日志行的原因是您要调用的函数不存在。通过使用调试器,您将能够看到它是哪个函数,哪个类缺少它,以及谁尝试了这个操作。

答案 1 :(得分:0)

有些评论要求进一步详细说明我为解决此问题而发表的评论。我不认为这是一个很好的添加作为编辑的问题,因为它具体超过了解决方案。自从我参与这个项目以来已经有一段时间了,所以它并不是我所有人都能做到的。我不确定我是否已经完成了所有事情......但我会尽力解释它。

在文件GameCenterManager.h中,似乎正在初始化authenticateLocalUser

- (void) authenticateLocalUser;

App_NameViewController.m文件中,viewDidLoad正在检查游戏中心是否可用:

self.currentLeaderBoard = kLeaderboardID;
if ([GameCenterManager isGameCenterAvailable]) {

    self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease];
    [self.gameCenterManager setDelegate:self];
    [self.gameCenterManager authenticateLocalUser];

} else {

    // The current device does not support Game Center.

}

在档案GameCenterManager.m

- (void) authenticateLocalUser
{
    if([GKLocalPlayer localPlayer].authenticated == NO)
    {
        [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) 
         {
             // report any unreported scores or achievements
             [self retrieveScoresFromDevice];
             [self retrieveAchievementsFromDevice]; 

             //[self callDelegateOnMainThread: @selector(processGameCenterAuth:) withArg: NULL error: error];
         }];
    }
}

我注释掉的那条让我超越Missed Method错误的行是:

[self callDelegateOnMainThread: @selector(processGameCenterAuth:) withArg: NULL error: error];

我希望这有帮助!

答案 2 :(得分:0)

将此代码添加到Game_CenterViewController.m,您将看到错误

- (void)processGameCenterAuth:(NSError *)error{ 
   NSLog(@"error %@", error); 
}
相关问题