gpt4 book ai didi

iOS 11 核心蓝牙 : Cannot remove an observer CBPeripheral for the key path "delegate"

转载 作者:行者123 更新时间:2023-12-03 20:03:40 30 4
gpt4 key购买 nike

自从 iOS 11 发布以来,我遇到了偶发但频繁的崩溃,其特征​​如下:

Cannot remove an observer <CBPeripheral 0x1c010ef10> for the key path "delegate" from <CBPeripheral 0x1c010ef10> because it is not registered as an observer.

这发生在扫描蓝牙设备、稍后连接到其中一个设备以及最终清理整个过程的情况下。所有这些任务都在非主调度队列中执行,以减轻主线程的压力(以获得更流畅的 UI 体验)。这段代码从 iOS 9 天开始就一直运行,没有出现任何问题,直到 iOS 11 发布后,才开始崩溃。

到目前为止,我在网上找到的有关此行为的唯一引用文献是 thisthis关于 Estimote SDK 的帖子。这些引用文献表明,不同调度队列中 CBCentralManager 的并行实例可能会出现问题,但是,官方 Programming Guide 中并未说明对此问题的特别注意。 。另外,Apple 员工成员对 another 的回复CoreBluetooth问题说明:

iOS 11 is in general going to be less forgiving for apps which don't hold a proper reference to CB objects...

听起来不太鼓舞人心。我尝试使用 XCode 及其配套工具对应用程序进行分析并寻找潜在的泄漏,但这也没有提供太多线索。

还有其他人遇到过类似的问题吗?关于如何解决它有什么建议吗?关于下一步在哪里挖掘的想法?

最佳答案

经过一段时间的测试后,在我们的特定情况下,解决方案包括将所有蓝牙堆栈相关工作转换到mainQueue。这意味着所有相关的回调都存在于主线程范围内。

此解决方案需要对这些回调中执行的工作格外小心(UI 也在此处运行),但由于大多数 CoreBluetooth 操作默认情况下都是异步的,因此这已被证明是可行的。此解决方法已在 iOS 11 中得到确认,到目前为止,iOS 12 中还没有报告任何问题。

这里的要点是:处理mainQueue中绝对必要的位,然后在必要时将其余负载转移到其他地方。

关于iOS 11 核心蓝牙 : Cannot remove an observer CBPeripheral for the key path "delegate",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47828969/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com