CnOps 社区
首页开源项目实践文章视频课程常见问答开发者工具
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具

CnOps 社区

愿景

CnOps 社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页问答iOS 僵尸对象(Zombie Object)是如何产生的,如何检测?

iOS 僵尸对象(Zombie Object)是如何产生的,如何检测?

#僵尸对象#Zombie#EXC_BAD_ACCESS#内存问题#iOS

CNOps | 2026-03-19

僵尸对象是指已被释放(dealloc)的内存块,但对应的指针仍然指向这块内存,代码试图通过该指针访问它时会导致 EXC_BAD_ACCESS 崩溃。产生僵尸对象的原因包括:使用 unsafe_unretained 或 assign 修饰对象属性,对象释放后指针不会自动置 nil;多线程竞争导致一个线程刚释放对象而另一个线程同时访问;CoreFoundation 与 ARC 桥接不当导致对象过早释放;以及 Block 或 Delegate 使用 assign 修饰等。检测方案的核心思路是 hook NSObject 和 NSProxy 的 dealloc 方法,在对象释放时计算对象 hash 并记录 class 信息,异常发生时通过地址 hash 查找记录表获取原始类型信息。出于性能考虑,记录上限为 32768 个对象,存在 hash 碰撞导致覆盖的可能。