0

내보기 컨트롤러가 더 이상 다음을 추가 한 후 해제하지됩니다 :보기 컨트롤러 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를 삭제할 수있는 방법이 있습니까?

+0

어디에서 어떻게 authenticateViewController를 선언하고 어떻게 닫습니까? – rdelmar

+0

AFAIK, GameKit 프레임 워크의 일부입니다. – soleil

+0

이 귀뚜라미는 지금까지이 질문에. 어떻습니까? 자기 dismissViewControllerAnimated를 호출 할 때 어떤 뷰 컨트롤러가 할당 해제되지 않게하는 원인은 무엇입니까? – soleil

답변

0

GameKit 인증 코드를 다른보기 컨트롤러로 옮겼습니다. 문제가 해결되지 않아야합니다.