添加 GameKit 后视图控制器未释放

Posted

技术标签:

【中文标题】添加 GameKit 后视图控制器未释放【英文标题】:View Controller not deallocated after adding GameKit 【发布时间】:2013-04-23 21:52:31 【问题描述】:

添加以下内容后,我的视图控制器不再被释放:

@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 放开我的视图控制器?

【问题讨论】:

你在哪里以及如何声明authenticateViewController,它是如何被解除的? AFAIK,它是 GameKit 框架的一部分。 好的,到目前为止,蟋蟀在这个问题上。这个怎么样 - 什么会导致任何视图控制器在调用 self dismissViewControllerAnimated:NO 时不会被释放? 其他东西有一个强指针。我再问一遍我的问题——authenticateViewController 是怎么解散的? 它自行解散。它是 GameKit 的一部分。此外,即使在 authenticateViewController 为 nil 的情况下(禁用 Game Center 时),我仍然遇到同样的问题。 【参考方案1】:

厌倦了处理这个问题并将 GameKit 身份验证代码移动到不同的视图控制器,在那里释放它并不重要。

【讨论】:

以上是关于添加 GameKit 后视图控制器未释放的主要内容,如果未能解决你的问题,请参考以下文章

iOS:关闭时视图控制器未释放

ARC 和dismissModalViewControllerAnimated:视图控制器内存未释放

目标c-关闭集合视图控制器后未释放常驻内存和脏内存

iOS 视图控制器未发布?

UIViewController 未释放

UIView 未正确释放