Цель C - CBCentralManager NSInternalInconsistencyException при выходе из ViewController
Я следовал коду Как получить статус Bluetooth (ВКЛ / ВЫКЛ) в iphone программно, чтобы получить статус Bluetooth.
Но когда я щелкаю viewController кнопкой обратной навигации, приложение вылетает со следующей ошибкой.
[CoreBluetooth] XPC connection invalid
*** Завершение работы приложения из-за необработанного исключения "NSInternalInconsistencyException", причина: "Экземпляр 0x170261c80 класса CBCentralManager был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы в нем. Информация о текущем наблюдении: (Контекст: 0x1aa9c3710, Свойство: 0x170056b90> Контекст: 0x1aa9c3710, Свойство: 0x170056b00> Контекст: 0x1aa9c3710, Свойство: 0x170056b90> Контекст: 0x1aa9c3710, Свойство: 0x170056b00>)'
Я пытался удалить наблюдателей, указанных выше при вызове viewWillDisappear, но ошибка все еще приходит.
[self.bluetoothManager removeObserver:self forKeyPath:@"state"];
[self.bluetoothManager removeObserver:self forKeyPath:@"delegate"];
И я попробовал
self.bluetoothManager.delegate = nil;
А также
self.bluetoothManager = nil;
К сожалению, все они не работают.
Пожалуйста, дайте помощь.
Обновить:
Я хочу показать системное всплывающее оповещение, когда Bluetooth не включен при вызове - (void) обнаружение Bluetooth. Итак, я добавляю
[self.bluetoothManager init];
в - (недействительно) обнаружение Bluetooth.
Я обнаружил, что совершил ошибку.
Но я не могу найти другой метод, чтобы показать всплывающее окно по умолчанию (которое с кнопкой SETTING).
1 ответ
Я нашел основную причину, почему эта ошибка происходит.
Я сделал несколько инициализаций для менеджера Bluetooth, поэтому он назначил несколько наблюдателей.
Основываясь на моей цели, чтобы показать всплывающее окно предупреждения системы, когда Bluetooth не включен. Как init
появится всплывающее окно, мне нужно сначала установить nil
на блютуз менеджер и init
позже. Это работает без ошибок.
Вот мой окончательный код:
if(!self.bluetoothManager)
{
// Put on main queue so we can call UIAlertView from delegate callbacks.
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
} else{
if (self.bluetoothManager.state != CBManagerStatePoweredOn) {
self.bluetoothManager = nil;
self.bluetoothManager = [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_main_queue()];
}
}
[self centralManagerDidUpdateState:self.bluetoothManager];
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch(self.bluetoothManager.state)
{
case CBCentralManagerStatePoweredOn: [self pushViewController]; break;
case CBCentralManagerStateResetting:
case CBCentralManagerStateUnsupported:
case CBCentralManagerStateUnauthorized:
case CBCentralManagerStatePoweredOff:
default: break;
}
}