Мой контроллер представления больше не освобождается после добавления следующего:
@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 отказаться от моего контроллера просмотра?