在这个代码中导致“错过的方法”是什么?
如果这是一个完全不符合标准的问题,或者如果我没有提供足够的信息,我会提前道歉 – 我对iOS开发(和Objective-C)非常陌生,并且有一种跳入深层的习惯结束…
我无法理解GameCenterManager.m中的“callDelegate”代码,该代码位于GKTapper示例代码中,也在本教程中提供: 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"); } }
我的应用程序总是logging“错过的方法”行,但我不知道这个callDelegate代码实际上在做什么(所以我不能修复它)。 我想最好的方法是学习这个实际上在做什么,并获得比“错过的方法”更好的输出…
一个警告是,我的应用程序目前正在使用沙箱模式的游戏中心,因为我还在开发它。 在这种情况下可能会预期这种“错过的方法”路线 – 我也不确定。
任何人都可以将这段代码翻译成段落forms吗? 我特别不确定'[delegate respondsToSelector:selector]'的一块。
或者,任何人都可以重写NSLog行,以便输出更多/相关的问题的细节? 我试图看到哪个select器不正确地通过“respondsToSelector”,但它似乎没有工作:
NSLog(@"Missed Method, %@", selector);
最好的方式来看看到底发生了什么是在callDelegate的开始放置一个断点,然后debugging你的程序,而不是简单地运行它。 你可以通过按cmd-y进行debugging。
这样做,每当你的程序进入callDelegate函数,它停止,debugging器窗口popup。 在那里,你将能够检查来电的来源和参数。
至于这个函数的简单描述,我会说它是一个帮助函数,它通过在select器的存在检查之前包装对select器的调用。 而不是每次检查和执行select器,你调用辅助函数,将为你做这两件事情。
所以,你总是看到日志行的原因是你想调用的函数不在那里。 通过使用debugging器,您将能够看到它是哪个function,哪个类缺less它,以及谁尝试了这个操作。
有些意见要求进一步的细节,我已经解决了这个问题。 我认为这不是一个好的补充,因为它专门解决了这个问题。 我从事这个项目已经有一段时间了,所以并不是所有的事情都在我的头顶,我也不确定我是否做了一切正确的事情,尽pipe我会尽我所能去解释它。
在文件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); }