关于 ObjC 通知的一个神奇崩溃

关于 ObjC 通知的一个神奇崩溃

💡 原文中文,约2600字,阅读约需7分钟。
📝

内容提要

近日发现一个发通知时触发的 EXC_BAD_ACCESS 崩溃,经过排查发现是订阅端设置的参数类型不匹配导致的。将参数类型改为 Notification 后问题解决。同时发现该崩溃受 Xcode 缓存影响,且复现路径较苛刻。对于为什么纯 Swift 不会崩溃而混编时会崩溃以及两种参数导致的崩溃类型不一样的问题,仍需继续探索答案。

🎯

关键要点

  • 发现发通知时触发的 EXC_BAD_ACCESS 崩溃,原因是订阅端参数类型不匹配。
  • 将参数类型改为 Notification 后问题解决。
  • 崩溃受 Xcode 缓存影响,复现路径苛刻。
  • 纯 Swift 不会崩溃,而混编时会崩溃,需继续探索原因。
  • 崩溃信息误导性强,复现条件复杂。
  • 混编时,Swift 订阅参数设置为可选闭包类型,且默认值为 nil。
  • OC 发送通知时,发现 onReceive 方法指针不存在,只有 onReceiveWithOther: 指针。
  • 不同参数类型导致崩溃类型不同,闭包类型崩溃为 EXC_BAD_ACCESS,其他类型为 unrecognized selector sent to instance。
🏷️

标签

➡️

继续阅读