View Controller не освобождается после добавления GameKit

Мой контроллер представления больше не освобождается после добавления следующего:

@property (strong, nonatomic) GKLocalPlayer *player;

(in viewDidLoad)
self.player = nil;
[self authenticatePlayer];

- (void)authenticatePlayer
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];    
    __unsafe_unretained typeof(*localPlayer) *blockLocalPlayer = localPlayer;


    localPlayer.authenticateHandler =
    ^(UIViewController *authenticateViewController, NSError *error)
    {
        if (authenticateViewController != nil)
        {
            [self presentViewController:authenticateViewController animated:YES
                             completion:nil];
        }
        else if (blockLocalPlayer.isAuthenticated)
        {

            self.player = blockLocalPlayer;
            [self openGame];
        }
        else
        {
            // Disable Game Center
            self.player = nil;
            [self openGame];
        }
    };
}

- (void)setPlayer:(GKLocalPlayer *)player
{
    _player = player;
    NSString *playerName;
    if (_player)
    {
        playerName = _player.alias;
    }
    else
    {
        playerName = @"Anonymous Player";
    }
    NSLog(@"%@", [NSString stringWithFormat:@"Welcome %@", playerName]);
}

Проблема возникает независимо от того, подключается ли пользователь к игровому центру. В коде должно быть что-то, из-за чего контроллер представления остается в памяти после его закрытия. Если я прокомментирую эти строки:

self.player = nil;
[self authenticatePlayer];

контроллер представления будет правильно освобожден при увольнении.

РЕДАКТИРОВАТЬ: Моя догадка была верна. Из документов Apple:

Game Kit поддерживает строгую ссылку на ваш обработчик завершения даже после успешной аутентификации локального игрока. Если ваша игра переходит в фоновый режим, Game Kit автоматически снова аутентифицирует игрока всякий раз, когда ваша игра возвращается на передний план. Game Kit вызывает один и тот же обработчик завершения каждый раз, когда аутентифицирует локального игрока. Помните, что в блочном программировании на любой объект Objective-C, на который ссылается блок, также строго ссылается блок до тех пор, пока блок не будет освобожден. Поскольку Game Kit поддерживает строгую ссылку на ваш обработчик завершения до тех пор, пока ваша игра не завершится, любые объекты, на которые ссылается ваш обработчик аутентификации, также сохраняются на неопределенный срок.

Хотя это проблема для меня. Я использую Cocos2d, и у него возникают проблемы со сбросом представления, если только контроллер представления полностью не освобожден и не создан заново.

Есть ли способ заставить Game Kit отказаться от моего контроллера просмотра?


person soleil    schedule 23.04.2013    source источник
comment
Где и как вы объявляете аутентифицированный ViewController и как его отклонить?   -  person rdelmar    schedule 24.04.2013
comment
Насколько я знаю, это часть фреймворка GameKit.   -  person soleil    schedule 24.04.2013
comment
хорошо, сверчки пока по этому вопросу. Как насчет этого - что может привести к тому, что любой контроллер представления не будет освобожден при вызове self rejectViewControllerAnimated: NO?   -  person soleil    schedule 24.04.2013
comment
Что-то еще имеет сильный указатель на это. Я снова задам свой вопрос - как уволить аутентифицируемыйViewController?   -  person rdelmar    schedule 24.04.2013
comment
Оно отвергает себя. Это часть GameKit. Кроме того, даже в тех случаях, когда authenticationViewController равен нулю (когда Game Center отключен), у меня все еще есть та же проблема.   -  person soleil    schedule 24.04.2013
comment
Что ж, в опубликованном вами коде нет ничего похожего на то, что он должен сохранить ваш контроллер. Если вы прокомментируете два случая [self openGame], приведет ли это к освобождению вашего контроллера при закрытии?   -  person rdelmar    schedule 24.04.2013


Ответы (1)


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

person soleil    schedule 24.04.2013