Что вызывает «Пропущенный метод» в этом коде? - PullRequest
2 голосов
/ 12 июня 2011

Прошу прощения заранее, если это совершенно не обсуждаемый вопрос, или если я не включаю достаточно информации - я очень новичок в разработке для iOS (и Objective-C), и у меня есть привычка прыгатьв глубокий конец ...

У меня проблемы с пониманием кода "callDelegate" в GameCenterManager.m, который находится в примере кода 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");
    }
}

Мое приложение всегда регистрирует эту строку "Пропущенный метод", но я не уверен, что на самом деле делает этот код callDelegate (поэтому я не могу это исправить).Я считаю, что лучший способ продвинуться вперед - это узнать, что это на самом деле делает, и получить лучший результат, чем «Пропущенный метод» ...

Одно предостережение: мое приложение в настоящее время использует Game Center в режиме песочницы, так как яЯ все еще развиваю это.Эту строку «Пропущенный метод» можно ожидать в этой ситуации - я тоже не уверен в этом.

Кто-нибудь сможет перевести этот код в форму абзаца?Я особенно не уверен насчет части «[Delegate RespondsToSelector: selector]».

В качестве альтернативы, кто-нибудь сможет переписать строку NSLog, чтобы она выводила более / уместную информацию о проблеме?Я пытался это сделать, надеясь увидеть, какой селектор не проходит через 'responsedsToSelector' должным образом, но, похоже, он не работает:

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

Ответы [ 3 ]

5 голосов
/ 12 июня 2011

Лучший способ точно увидеть, что происходит, - поставить точку останова в начале callDelegate, а затем отладить вашу программу вместо простого ее запуска.Вы можете выполнить отладку, нажав cmd-y.

Делая так, каждый раз, когда ваша программа входит в функцию callDelegate, она останавливается и всплывает окно отладчика.Там вы сможете проверить, откуда поступил вызов и каковы параметры.

Что касается простого описания этой функции, я бы сказал, что это вспомогательная функция, которая упаковывает вызов селектора, выполнив предшествующуюэто с проверкой существования того селектора.Вместо того, чтобы проверять каждый раз и выполнять селектор, вы вызываете вспомогательную функцию, которая сделает обе вещи за вас.

Итак, причина, по которой вы всегда видите строку журнала, состоит в том, что функция, которую вы хотите вызвать, состоит в том, чтоне там.С помощью отладчика вы сможете увидеть, какая это функция, какой класс ее пропустил и кто пытался выполнить операцию.

0 голосов
/ 04 июня 2014

Добавьте этот код в Game_CenterViewController.m, вы увидите ошибку

- (void)processGameCenterAuth:(NSError *)error{ 
   NSLog(@"error %@", error); 
}
0 голосов
/ 29 декабря 2012

В некоторых комментариях запрашивалась дополнительная информация о том, что я прокомментировал для решения этой проблемы. Я не думаю, что это было бы хорошо, чтобы добавить в качестве редактирования к вопросу, так как он конкретно касается разрешения. Прошло много времени с тех пор, как я работал над этим проектом, так что это не все в моей голове, и я не уверен, что все сделал правильно ... Хотя я сделаю все возможное, чтобы объяснить это.

В файле 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];

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...