Я занимаюсь разработкой приложения для iOS, которое устанавливает связь между устройством iOS и транспортным средством через адаптер OBD2. Для этого я использую библиотеку - LTSupportAutomotive . Связь работает хорошо. Проблема возникает, когда адаптер отключен от автомобиля и, следовательно, соединение прерывается. Через некоторое время я получаю крах. У меня есть отчет о сбое Crashlytics, и ошибка: EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x00000008ba9ae0a0. Из того, что я прочитал, это означает, что есть указатель на недействительную память. Я не могу по-настоящему понять, почему это произойдет и как приступить к его решению. Сбой происходит следующим способом из библиотеки:
-(void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
{
LOG( @"Did disconnect %@: %@", peripheral, error );
if ( peripheral == _adapter )
{
[_inputStream close];
[_outputStream close];
}
}
Есть уведомление, что соединение прервано. Когда я обращаюсь с этим, я устанавливаю переменную, указывающую на объект класса (LTBTLESerialTransporter
), который имеет метод выше, на nil
. Это должно вызвать его dealloc
метод, где метод disconnect
должен быть вызван:
-(void)disconnect
{
[self stopUpdatingSignalStrength];
[_inputStream close];
[_outputStream close];
if ( _adapter )
{
[_manager cancelPeripheralConnection:_adapter];
}
[_possibleAdapters enumerateObjectsUsingBlock:^(CBPeripheral * _Nonnull peripheral, NSUInteger idx, BOOL * _Nonnull stop) {
[_manager cancelPeripheralConnection:peripheral];
}];
}
Отчет о сбое выглядит следующим образом:
Сбой: LTBTLESerialTransporter
0 libobjc.A.dylib 0x1d35a3bf0 objc_retain + 16
1 LTSupportAutomotive 0x100d58040 - [LTBTLEWriteCharacteristicStream close] + 80
2 LTSupportAutomotive 0x100d56c04 - [LTBTLESerialTransporter centralManager: didDisconnectPeripheral: ошибка:] + 264
3 CoreBluetooth 0x1d9e423ec - [CBCentralManager handlePeripheralDisconnectionCompleted:] + 232
4 CoreBluetooth 0x1d9e431e8 - [CBCentralManager handleMsg: args:] + 620
5 CoreBluetooth 0x1d9e51430 __30- [CBXpcConnection _handleMsg:] _ block_invoke + 60
6 libdispatch.dylib 0x1d3df0a38 _dispatch_call_block_and_release + 24
7 libdispatch.dylib 0x1d3df17d4 _dispatch_client_callout + 16
8 libdispatch.dylib 0x1d3d9a320 _dispatch_lane_serial_drain $ VARIANT $ mp + 592
9 libdispatch.dylib 0x1d3d9ae70 _dispatch_lane_invoke $ VARIANT $ mp + 480
10 libdispatch.dylib 0x1d3d9a1ec _dispatch_lane_serial_drain $ VARIANT $ mp + 284
11 libdispatch.dylib 0x1d3d9ae3c _dispatch_lane_invoke $ VARIANT $ mp + 428
12 libdispatch.dylib 0x1d3da34a8 _dispatch_workloop_worker_thread + 596
13 libsystem_pthread.dylib 0x1d3fd1114 _pthread_wqthread + 304
14 libsystem_pthread.dylib 0x1d3fd3cd4 start_wqthread + 4