EXC_BAD_ACCESS 和僵尸对象

在iOS开发中,EXC_BAD_ACCESS和僵尸对象(Zombie Objects)有关联,但不是一回事。

EXC_BAD_ACCESS是一种常见的崩溃类型,表示程序试图访问已经释放的内存地址。这通常是因为对象已经被释放(即内存已经被回收),但程序仍然试图向该对象发送消息或者访问其属性。

僵尸对象是一种调试技术,用于帮助定位EXC_BAD_ACCESS错误。当启用僵尸对象时,对象在释放后不会被立即回收,而是被标记为僵尸对象。之后如果程序试图访问这个对象,就会触发一个已知的行为(比如抛出异常或打印日志),从而帮助我们定位问题。

因此,EXC_BAD_ACCESS是错误类型,而僵尸对象是调试这种错误的一种工具。

总结:

  • EXC_BAD_ACCESS:表示访问了已释放内存的错误。

  • 僵尸对象:一种调试模式,用于检测和定位对已释放对象的访问。

在开发过程中,开启僵尸对象调试可以帮助我们快速定位导致EXC_BAD_ACCESS的代码。

但它们有密切关联:

EXC_BAD_ACCESS(坏访问)

  • 是什么:一种内存访问错误导致的崩溃

  • 原因:试图访问已释放或无效的内存地址

  • 常见场景:

    • 向已释放的对象发送消息

    • 访问已释放的内存

    • 栈溢出或数组越界

    • 野指针访问

僵尸对象(Zombie Objects)

  • 是什么:一种调试技术/对象状态

  • 作用:帮助检测和调试EXC_BAD_ACCESS错误

  • 原理:对象释放时不立即回收内存,而是标记为"僵尸",当再次被访问时触发可识别的错误

关键区别

方面 EXC_BAD_ACCESS 僵尸对象
性质 崩溃类型/错误 调试技术/对象状态
关系 症状(结果) 诊断工具(手段)
触发时机 访问无效内存时 访问已释放对象时

实际联系

复制代码
// 示例:典型的EXC_BAD_ACCESS场景
class MyClass {
    func doSomething() {}
}

var obj: MyClass? = MyClass()
obj?.doSomething()  // ✅ 正常访问
obj = nil           // 释放对象

// 如果不启用僵尸对象检测:
obj?.doSomething()  // ❌ 可能直接EXC_BAD_ACCESS崩溃
// 信息很少,难以调试

// 如果启用僵尸对象检测:
// obj?.doSomething() 会抛出明确的错误信息:
// "message sent to deallocated instance 0x..."

如何启用僵尸对象调试

  1. Xcode中:

    • Scheme设置 → Run → Diagnostics

    • 勾选"Zombie Objects"

  2. 代码中启用:

复制代码
// 环境变量方式
// 在Scheme的Arguments中添加:
// NSZombieEnabled = YES
// 或 MallocStackLogging = YES

调试建议

  1. 常规调试:

    • 开启僵尸对象检测

    • 使用Address Sanitizer

    • 检查循环引用和弱引用

  2. 常见修复:

    • 避免悬垂指针

    • 合理使用弱引用(weak)

    • 注意block中的self捕获

    • 正确管理NSTimer等强引用对象

总结:EXC_BAD_ACCESS是"病",僵尸对象是"诊断工具"。不是一回事,但僵尸对象专门用来诊断EXC_BAD_ACCESS这类内存问题。

相关推荐
9527出列4 小时前
基于oss的断点续传实现
http·性能优化
AliCloudROS4 小时前
从 1 万到 20 万:OOS Loop 任务规模提升 20 倍的攻坚记录
运维·性能优化
yunwei376 小时前
eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器
linux·后端·性能优化
打工仔折腾 AI7 小时前
从零开始大模型微调:基于 PyTorch 与 ChatGLM 的 LoRA 实践指南
人工智能·pytorch·后端·python·深度学习·性能优化·ai agent 实战
Cx330❀8 小时前
深入浅出 Qt 绘图机制:从 QPainter 到四大图像类解析
开发语言·qt·ui·性能优化·图形渲染
江厌019 小时前
128GB 统一内存能跑多大模型?PGX 的容量、带宽与适用边界
性能优化
西红柿炖牛腩35410 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
黄俊懿1 天前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
步步为营DotNet2 天前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
CCblandy2 天前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构