You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

APP崩溃求助:创建类实例触发EXC_BAD_ACCESS及疑似无限循环

帮你排查 EXC_BAD_ACCESS 崩溃与无限循环问题

看起来你碰到了两个让人头疼的问题:创建Touch实例时触发EXC_BAD_ACCESS崩溃,还有隐藏的无限循环导致应用挂掉。我来帮你一步步拆解可能的原因和排查方向:

一、先分析 EXC_BAD_ACCESS 崩溃的可能诱因

这个错误通常是内存访问非法导致的,结合你的代码,重点排查这几个点:

  1. Touch 类的初始化逻辑问题
    你只贴了class Touch {...的开头,大概率问题出在这个类的初始化方法里:

    • 有没有未初始化的存储属性?比如如果latitude/longitude是未可选的属性,但初始化时没正确赋值?
    • 初始化方法里有没有访问已经被释放的对象?或者不小心写了递归调用(比如初始化里又创建了Touch实例)?
    • 有没有闭包循环引用?比如Touch里持有了某个闭包,而闭包又捕获了self但没处理弱引用?
  2. _grid 变量的状态异常
    你把_grid传入addTouch方法,有没有可能_grid是未初始化的隐式可选值(比如var _grid: Grid!),此时还没赋值就被传入方法,导致访问空指针?
    或者_grid内部的结构已经被破坏(比如数组越界访问、字典键不存在但强制解包)?

  3. 频繁创建 TouchService 实例的隐患
    你每次调用touchesMoved都新建一个TouchService(),如果这个类内部持有了某些全局资源或者有未正确释放的内存,反复创建可能会导致内存混乱。建议把TouchService作为控制器的属性初始化一次,而不是每次都新建:

    class YourViewController: UIViewController {
        private let touchService = TouchService() // 只初始化一次
        
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
            for touch in touches {
                let location = touch.location(in: self.view)
                let x = Float(location.x)
                let y = Float(location.y)
                let newTouch = Touch(latitude: x, longitude: y)
                touchService.addTouch(touch: newTouch, grid: _grid)
            }
        }
    }
    

二、排查无限循环的可能

无限循环通常会导致应用卡死甚至崩溃,结合你的场景,重点看这两个方向:

  1. TouchService.addTouch 方法内部的循环逻辑
    比如这个方法里有没有遍历grid的同时修改grid的内容?比如遍历数组时往数组里加元素,会导致遍历永远无法结束;或者有递归调用没设置终止条件?

  2. 触摸事件的循环触发
    如果addTouch方法里修改了视图的位置、层级或者触摸相关的属性,可能会再次触发touchesMoved事件,形成“触摸→修改视图→再次触发触摸”的循环。

三、实用的调试技巧

  1. 开启 Zombie Objects 定位内存问题
    在Xcode的Scheme设置里(Edit Scheme → Diagnostics),勾选Zombie Objects,这样当EXC_BAD_ACCESS发生时,Xcode会告诉你具体是哪个对象被过度释放了,精准定位问题。

  2. 添加断点逐步排查

    • 在Touch的初始化方法、TouchService.addTouch方法开头加断点,看每次调用的参数是否正常,有没有重复进入某个方法的情况。
    • 在touchesMoved里加日志,打印每次触发的时间和触摸位置,看是否在短时间内被疯狂调用(如果是,大概率是无限循环触发了触摸事件)。
  3. 补全关键代码
    如果你能把Touch类的完整代码、TouchService.addTouch的实现贴出来,就能更精准地定位问题啦!

内容的提问来源于stack exchange,提问作者CasualCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:02:29