来自我的应用程序用户的崩溃日志显示了崩溃堆栈,如下所示。我很难解释这里发生了什么,尤其是那里的NSKVODeallocate。我知道NSKVODeallocate引发异常的崩溃,这通常是由在取消分配类之前尚未删除的KVO观察者引起的。
但情况并非如此:NSKVODeallocate在CBPeripheral上调用dealloc,最终导致崩溃。
这是否意味着CBPeripheral在我的BLE_Device类上有一个KVO观察者?这是否意味着BLE_Device在CBPeripheral类上有一个KVO观察者?它与KVO有什么关系 - 我在网上的某处读到这是弱指针的实现方式。但是BLE_Device肯定没有指向CBPeripheral的弱指针。它确实有一个指向CBPeripheral的强指针(currentDevice
),但我希望直接从[BLE_Device .cxx_destruct]
解除分配。
BLE_Device dealloc,如果相关:
- (void) dealloc
{
currentDevice.delegate = nil;
peripheralTableView.delegate = nil;
selector.delegate = nil;
CM.delegate = nil;
if (currentDevice != nil) {
[CM cancelPeripheralConnection:currentDevice];
}
if (CM.state == CBCentralManagerStatePoweredOn) {
[CM stopScan];
}
}