EXC_BAD_ACCESS 异常

这次的代码在一行报了 EXC_BAD_ACCESS 异常,后来发现是这次的对象没有创建成功,虚函数调用直接失败,这里简单记下这个异常的原因及常见解决方法

原因

当调试器报出 EXC_BAD_ACCESS 异常时,通常意味着这里向一个已经被释放的对象发送消息。
从更底层的角度上来说,在 C, Object-C 和 C++ 中,通常是由于指针的错误使用造成的,每当使用一个指针给其指向的对象发送消息时,这个指针都要解引用,实际访问其指向的内存空间,当这块内存空间并不在这个程序映射的内存中时,再次访问这块内存时系统内核就会发送一个异常(EXC), 表示程序不能访问这块内存(BAD ACCESS)

总而言之,当遇到 EXC_BAD_ACCESS 时,通常表示给一块不能执行该消息的内存发送了消息

Debug

程序并不会因为错误指针的传递或者赋值而崩溃,只会因为对其解引用而崩溃,被释放的对象会成为 zombie 对象。
在 Xcode 中开启 enable zombie Objects 可以在调试时使 zombie 保留在程序中,调试器可以观察到向一个 zombie 对象发送消息时的详细信息。
在一般的 Unix 平台上可以使用 Valgrind 内存检测工具检查内存的违法操作行为。