如何解决是什么原因导致此代码中出现“缺少方法”?
| 如果这是一个完全不合常规的问题,或者如果我没有提供足够的信息,请提前道歉-我是iOS开发(和Objective-C)的新手,并且有跳入其中的习惯最深的一面... 我在理解GameCenterManager.m中的“ callDelegate”代码时遇到了麻烦,该代码在GKTapper示例代码中,并且也在本tut +教程中提供:http://mobile.tutsplus.com/tutorials/iphone/ios SDK游戏中心成就和排行榜第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 responsesToSelector:选择器] \'部分。
或者,有人可以重写NSLog行,以便输出有关该问题的更多/相关详细信息吗?我尝试了此操作,希望能看到哪个选择器未正确通过\'respondsToSelector \',但它似乎不起作用:
NSLog(@\"Missed Method,%@\",selector);
解决方法
了解确切情况的最好方法是在callDelegate的开头放置一个断点,然后调试程序,而不是简单地运行它。您可以通过按cmd-y进行调试。
这样做,每次程序进入callDelegate函数时,它都会停止并弹出调试器窗口。在那里,您将能够检查呼叫来自何处以及参数是什么。
关于此函数的简单描述,我想说它是一个辅助函数,通过在选择器之前检查该选择器的存在来包装对选择器的调用。您无需调用每次检查和选择器的执行情况,而是调用帮助程序函数,该函数将为您做两件事。
因此,您总是看到日志行的原因是您要调用的函数不存在。通过使用调试器,您将能够看到它是哪个功能,哪个类缺少它以及谁尝试了该操作。
, 一些评论要求提供有关我为解决此问题所评论内容的更多详细信息。我认为添加对问题的编辑不是很好,因为它特别超出了分辨率。自从我从事这个项目以来已经有一段时间了,所以这不是我的首要任务,而且我不确定我是否正确地完成了所有工作...我\'尽我所能解释。
在文件
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];
我希望这有帮助!
, 将此代码添加到Game_CenterViewController.m中,您将看到错误
- (void)processGameCenterAuth:(NSError *)error{
NSLog(@\"error %@\",error);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。