添加 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 后视图控制器未释放的主要内容,如果未能解决你的问题,请参考以下文章