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