내보기 컨트롤러가 더 이상 다음을 추가 한 후 해제하지됩니다 :보기 컨트롤러 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에서 doc :
Game Kit는 로컬 플레이어를 성공적으로 인증 한 후에도 완고한 참조를 유지합니다. 게임이 으로 이동하면 게임 키트는 게임이 포 그라운드로 돌아갈 때마다 다시 플레이어를 자동으로 인증합니다. 게임 키트는 로컬 플레이어를 인증 할 때마다 동일한 완료 핸들러 을 호출합니다. 블록 프로그래밍에서 블록 내부에서 참조 된 Object-C 오브젝트 도 블록이 해제 될 때까지 블록 에 의해 강하게 참조됩니다. 게임 키트는 게임이 종료 될 때까지 완료 핸드셋에 대한 참조를 강력하게 유지하므로 인증 핸들러 내에서 참조되는 개체는 무기한으로 보유됩니다 ( ).
이것은 나에게 문제입니다. 나는 Cocos2d를 사용하고 있는데 뷰 컨트롤러가 완전히 할당 해제되고 새로 생성되지 않는 한 뷰를 재설정하는 데 문제가 있습니다.
Game Kit에서 내 View Controller를 삭제할 수있는 방법이 있습니까?
어디에서 어떻게 authenticateViewController를 선언하고 어떻게 닫습니까? – rdelmar
AFAIK, GameKit 프레임 워크의 일부입니다. – soleil
이 귀뚜라미는 지금까지이 질문에. 어떻습니까? 자기 dismissViewControllerAnimated를 호출 할 때 어떤 뷰 컨트롤러가 할당 해제되지 않게하는 원인은 무엇입니까? – soleil