【问题标题】:What causes "Missed Method" in this code?是什么导致此代码中的“错过方法”?
【发布时间】:2011-06-12 16:59:50
【问题描述】:

如果这是一个完全不符合标准的问题,或者我没有提供足够的信息,请提前道歉 - 我对 iOS 开发(和 Objective-C)非常陌生,并且有跳跃的习惯进入深渊……

我在理解 GKTapper 示例代码中的 GameCenterManager.m 中的“callDelegate”代码时遇到了问题,该代码也在这个 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");
    }
}

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

需要注意的是,我的应用目前正在沙盒模式下使用 Game Center,因为我仍在开发它。在这种情况下,可能会出现这条“Missed Method”行——我也不确定。

有人能把这段代码翻译成段落形式吗?我特别不确定“[delegate respondsToSelector: selector]”部分。

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

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

【问题讨论】:

  • kylehickinson 的帮助下,结果证明这是由于“authenticateLocalUser”对“processGameCenterAuth”的可选调用(提供登录时执行某些操作的选项)。删除“processGameCenterAuth”的引用解决了这个问题。
  • 你能解释一下你到底删除了什么吗?我遇到了同样的错误...干杯..
  • 詹姆斯,你能告诉我们你做了什么吗,我也遇到了这个问题
  • 我已经添加了所有我能回答的细节——希望对你有所帮助!

标签: iphone objective-c ios ios4


【解决方案1】:

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

这样做,每次你的程序进入 callDelegate 函数时,它都会停止并弹出调试器窗口。在那里您将能够检查调用来自何处以及参数是什么。

至于对这个函数的简单描述,我会说它是一个辅助函数,它通过检查选择器的存在来包装对选择器的调用。您无需每次都检查并执行选择器,而是调用将为您完成这两件事的辅助函数。

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

【讨论】:

  • 编辑答案以包含更多详细信息
【解决方案2】:

一些 cmets 要求提供有关我为解决此问题而注释掉的内容的更多详细信息。我认为将其添加为问题的编辑并不好,因为它专门针对解决方案。自从我从事这个项目以来已经有一段时间了,所以这并不是我的全部想法,我不确定我是否正确地完成了所有事情......不过,我会尽力解释它。

在文件GameCenterManager.h 中,看起来authenticateLocalUser 正在初始化:

- (void) authenticateLocalUser;

在文件App_NameViewController.m 中,viewDidLoad 正在检查 Game Center 是否可用:

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];

我希望这会有所帮助!

【讨论】:

    【解决方案3】:

    将此代码添加到 Game_CenterViewController.m 你会看到错误

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-14
      • 2011-01-10
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多