Приложение iOS7 вылетает, когда я нажимаю кнопку «Домой», а затем возобновляю его

Это сообщение об ошибке, которое я получаю: Terminating App из-за неосторожного исключения «NsinvalidArgumentException», причина: «- [___ NSCFString AuthenticationChanged]: Нераспределенный селектор, отправленный на экземпляр 0x176769A0 'Стек первого броска: (0x30496ECB 0x3Ac31Ce7 0x30458F01 0x303CCD69 0x30db8cc5 0x3102f43b 0x3b11Ad53 0x3b11Ad3f 0x3b11d6c3 0x30461641 0x3045ff0d 0x303ca729 0x303ca50b 0x353396d3 0x32d2b871 0xb8591 0x3b12fab7) libc ++ abi.dylib: завершение с неуклюжем исключением типа nsexception

Я интегрировал игровой центр в приложение, и этот код, вероятно, вызывает сбой:

- (id)init {
    if ((self = [super init])) 
    {
        gameCenterAvailable = [self isGameCenterAvailable];
        if (gameCenterAvailable) {
            NSNotificationCenter *nc =
            [NSNotificationCenter defaultCenter];
            [nc addObserver:self
                   selector:@selector(authenticationChanged)
                       name:GKPlayerAuthenticationDidChangeNotificationName
                     object:nil];
        }
    }

    return self;
}

- (void)authenticationChanged {
    if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) {
        NSLog(@"Authentication changed: player authenticated.");
        userAuthenticated = TRUE;

    } else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) {
        NSLog(@"Authentication changed: player not authenticated");
        userAuthenticated = FALSE;

    }

person user3695947    schedule 22.07.2014    source источник
comment
Можете ли вы также добавить метод authenticationChanged к своему вопросу?   -  person mohacs    schedule 23.07.2014
comment
Это супер плохой код. Извините за резкость, но я предлагаю вам вернуться к своим основам.   -  person duci9y    schedule 23.07.2014
comment
упс, код не отформатировался, когда я его вставил. отредактировано.   -  person user3695947    schedule 23.07.2014


Ответы (1)


Наиболее вероятной причиной этой проблемы является то, что вы никогда не удаляете наблюдателя, когда это необходимо.

Добавьте в свой класс следующее:

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Это гарантирует, что старые объекты больше не будут регистрироваться для получения уведомления.

Кстати, не повторяйте код. Ваш метод authenticationChanged будет лучше:

- (void)authenticationChanged {
    if ([GKLocalPlayer localPlayer].isAuthenticated) {
        userAuthenticated = !userAuthenticated;
        NSLog(@"Authentication changed: player %@authenticated.", userAuthenticated ? @"" : @"not ");
    }
}

И обязательно используйте YES или NO с BOOL переменными.

person rmaddy    schedule 22.07.2014