添加以下内容后,我的视图控制器不再被取消分配:
@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会自动验证播放器 每当你的游戏移回前台时再次。游戏套件电话 每次验证本地时都使用相同的完成处理程序 播放器。请注意,在块编程中,任何Objective-C对象 块内引用的块也强烈引用 直到该块被释放。因为Game Kit保持强大 引用你的完成处理程序,直到你的游戏终止,任何 从您的身份验证处理程序中引用的对象也是 无限期地举行。
这对我来说是一个问题。我正在使用Cocos2d,除非视图控制器被完全解除分配并重新创建,否则重置视图时会出现问题。
有没有办法让Game Kit放开我的视图控制器?
答案 0 :(得分:0)
厌倦了处理这个问题,并将GameKit身份验证代码移到另一个视图控制器,在那里取消分配它并不重要。