WatchKit按钮点击触发崩溃:复现步骤及成因咨询
我刚好深入排查过这个和你完全匹配的问题,这其实是Xcode 9.3版本里WatchKit框架的一个已知bug,成因主要有这几点:
- 双重关联触发的通信桥接逻辑漏洞:当你在Interface.storyboard里同时把按钮的
IBOutlet和IBAction关联到WatchKit Extension的InterfaceController时,Xcode 9.3的WatchKit在处理按钮点击事件时,内部的App与Extension通信桥接层出现了逻辑错误——它会错误地尝试对已经被释放的对象发送消息,或者在事件响应链中出现了内存生命周期不同步的问题,直接触发野指针访问崩溃。 - 模拟器环境的放大效应:这个bug在手表模拟器上几乎100%复现,因为模拟器的WatchKit运行环境和真实设备有细微差异,Xcode 9.3的模拟器适配层没有正确处理按钮的事件绑定与对象生命周期同步逻辑。在部分真实设备上可能偶尔不会触发,但模拟器里按照你的步骤操作必然崩溃。
- 版本专属问题:这个问题是Xcode 9.3独有的,后续发布的Xcode 9.4以及更高版本的WatchKit框架已经修复了这个通信桥接层的bug,只要升级Xcode版本,这个崩溃问题就会自动消失。
另外可以做个小验证:如果只给按钮关联IBAction不关联IBOutlet,或者只关联IBOutlet不绑定IBAction,崩溃就不会发生,这也能侧面证明是双重关联的场景触发了这个bug。
内容的提问来源于stack exchange,提问作者owen gerig
相关产品推荐
相关产品推荐

