2013-08-07 3 views
0

Это сводит меня с ума. Каждый раз, когда я пытаюсь выполнить аутентификацию локального игрока в Game Center, я получаю нить-1 сигкилл. Это происходит асинхронно после того как я установить localPlayer «ы authenticateHandler как так:Идентификация игрового центра всегда приводит к sigabrt

- (void)authenticateLocalPlayer 
{ 
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) 
    { 
     GKLocalPlayer __weak *localPlayer = [GKLocalPlayer localPlayer]; 
     localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) 
     { 
      if (viewController != nil) 
      { 
       [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:viewController animated:YES completion:nil]; 
      } 
      else if (localPlayer.isAuthenticated) 
      { 
       NSLog(@"Player authenticated"); 
      } 
      else 
      { 
       NSLog(@"Player authentication failed"); 
      } 
     }; 
    } 
} 

Любые идеи?

ответ

0

Я часто видел, как systemVersion тестировалась с помощью сравнения строк вместо сравнения чисел. Попробуйте просто печатая значение из

[[[UIDevice CurrentDevice] SystemVersion] floatValue]> = 6,0

проверить, что нет ничего плохого в этом выражении. Я знаю, что следующий метод работает:

-(BOOL) os6 { 
    NSString *targetSystemVersion = @"6.0"; 
    NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion]; 
    if ([currentSystemVersion compare:targetSystemVersion options:NSNumericSearch] == NSOrderedAscending) { 
     return NO; //current system version is less than 6.0 
    } else { 
     return YES; 
    } 
} 
+0

Это не проблема - он правильно определяет операционную систему и выполняет содержимое, если заявление. Он просто падает после запуска блока асинхронно. –

+0

[GKLocalPlayer localPlayer] возвращает singleton, а __weak вызывает отправку релиза в какой-то момент (я не понимаю, когда это произойдет, но в будущем), и нет необходимости выпускать синглтон. localPlayer может быть освобожден вместе с блоком до того, как блок завершит выполнение. Попробуйте удалить __weak; – RobertL

0

[GKLocalPlayer LocalPlayer] возвращает одноплодное и __weak отпускания на какое-то время (я не понимаю, когда это произойдет, но в каком-то момент в будущем). localPlayer может быть освобожден вместе с блоком до того, как блок завершит выполнение. Не нужно выпускать синглтон. Попробуйте удалить __weak.

0

Попробуйте поставить __weak до GKLocalPlayer.

Это разница только я могу видеть между вашим кодом и кодом я использую ...

Смежные вопросы