Xcode 9.3中WatchKit按钮点击崩溃求助:EXC_BAD_ACCESS错误
问题分析与解决思路
首先,咱们先拆解这个崩溃的本质:EXC_BAD_ACCESS (code=1, address=0x0) 加上崩溃发生在swift_getObjectType函数,这说明代码尝试访问一个已释放或根本不存在的nil对象的类型信息,属于典型的空指针/野指针访问问题。
针对你的场景,问题根源出在Xcode 9.3对Apple Watch Storyboard的处理逻辑上,具体原因可归纳为:
- 当你在Storyboard中给按钮仅绑定
Sent Action(即IBAction)但未配置segue时,Xcode 9.3的WatchKit运行时框架存在一个bug:它错误地默认按钮存在对应的segue关联对象,点击按钮时会尝试读取这个不存在的segue的类型信息,最终因访问0x0空地址触发崩溃。 - 之前的Xcode版本没有这个逻辑漏洞,因此不会出现该问题。
为什么添加segue后崩溃会消失?
- 给按钮配置segue后,系统有了合法的segue对象可以访问,点击按钮时运行时框架能正确获取到该segue的类型信息,不会再去访问空地址,自然就避免了崩溃。
如果你不想保留这个多余的segue,也可以试试这两个替代方案:
- 移除Storyboard中按钮的
Sent Action绑定,改用代码手动添加点击事件:比如在awake(withContext:)方法里通过addTarget(_:action:for:)绑定IBAction - 升级到Xcode 9.3之后的版本(如Xcode 9.4或更高),苹果大概率已经修复了这个特定版本的WatchKit Storyboard bug
内容的提问来源于stack exchange,提问作者avivalluf
相关产品推荐
相关产品推荐

