2011-06-12 118 views
2

如果這是一個完全不符合標準的問題,或者我的信息不足 - 我對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」行,但我不確定什麼t他的callDelegate代碼實際上在做(所以我不能修復它)。我想最好的方法是學習這是什麼實際上在做什麼,並獲得比'錯過的方法'更好的輸出...

一個警告是,我的應用程序目前在沙箱模式下使用Game Center,因爲我仍在開發它。在這種情況下可能會出現這種「錯過的方法」路線 - 我也不確定。

有人能將這段代碼翻譯成段落形式嗎?我特別不確定'[delegate respondsToSelector:selector]'片段。

或者,任何人都可以重寫NSLog行,以便輸出更多/相關的問題細節?我想這在看到哪個選擇不通過「respondsToSelector」走出正確的希望,但它似乎沒有工作:

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

從[kylehickinson]幫助(http://twitter.com/#!/kylehickinson),這竟然是由於來自'authenticateLocalUser'的對'processGameCenterAuth'的可選調用(提供在登錄時執行某些操作的選項)。刪除'processGameCenterAuth'的引用解決了這個問題。 – 2011-06-12 17:52:25

+0

你能解釋一下你究竟刪除了什麼嗎?我得到了同樣的錯誤...乾杯.. – user123 2012-09-01 11:25:50

+0

詹姆斯,請你告訴我們你到底做了什麼,我也得到這個問題 – PeterK 2012-12-29 13:12:00

回答

5

T'he最好的辦法,看看到底發生了什麼事是把一個斷點在callDelegate的開頭,然後調試你的程序,而不是簡單地運行它。您可以通過按cmd-y進行調試。

這樣做,每當程序進入callDelegate函數時,它都會停止並彈出調試器窗口。在那裏您可以檢查來電的來源以及參數。

至於這個函數的簡單描述,我會說它是一個輔助函數,它通過在選擇器的存在檢查之前包裝對選擇器的調用。而不是檢查每個時間和執行選擇器,而是調用輔助函數,該函數將爲您完成這兩件事。

所以,你總是看到日誌行的原因是你想調用的函數不在那裏。通過使用調試器,您將能夠看到它是哪個功能,哪個類缺少它,以及誰嘗試了該操作。

+0

編輯答案以包含更多詳細信息 – sergio 2011-06-12 17:23:06

0

有些意見要求進一步詳細說明我評論過的問題以解決此問題。我認爲這不是一個好的補充,因爲它專門解決了這個問題。自從我參與這個項目已經有一段時間了,所以它並不全是我的頭頂&我不確定我是否已經做好了一切準備工作......儘管如此,我會盡我所能解釋它。

在文件GameCenterManager.h,它看起來像authenticateLocalUser正在初始化:

- (void) authenticateLocalUser;

在文件App_NameViewController.mviewDidLoad被檢查是否遊戲中心可用:

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

我希望這有助於!

0

添加該代碼Game_CenterViewController.m你會看到錯誤

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