添加GameKit后,View Controller未解除分配

时间:2013-04-23 21:52:32

标签: ios memory-management uiviewcontroller game-center 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会自动验证播放器   每当你的游戏移回前台时再次。游戏套件电话   每次验证本地时都使用相同的完成处理程序   播放器。请注意,在块编程中,任何Objective-C对象   块内引用的块也强烈引用   直到该块被释放。因为Game Kit保持强大   引用你的完成处理程序,直到你的游戏终止,任何   从您的身份验证处理程序中引用的对象也是   无限期地举行。

这对我来说是一个问题。我正在使用Cocos2d,除非视图控制器被完全解除分配并重新创建,否则重置视图时会出现问题。

有没有办法让Game Kit放开我的视图控制器?

1 个答案:

答案 0 :(得分:0)

厌倦了处理这个问题,并将GameKit身份验证代码移到另一个视图控制器,在那里取消分配它并不重要。