January
11th,
2016
项目在某页面崩溃,ide断在EventDispatcher::cleanToRemovedListeners()。 据断点处信息_toRemovedListeners里有的值retaincount已经为0了,一定是多释放了。 但找半天没找到哪些地方用的不对,都是在onEnter里添加监听,在onExit里取消监听。 去到2dx里代码仓库看最新的提交也没发现有修复类似bug的,应该还是自己代码的原因。 最后没办法了,在所有代码使用listener的地方,添加时先retain,remove时再release。 改着改着就发现一个自定义控件的一个方法在remove里没把listener指针置空,导致onExit时 又释放了一遍。再回头看崩溃页面,果然用到过这个控件。我*
这种内存错误bug最难调了,崩溃时有效信息不多,而且不一定在什么时候、什么地方才会表现出来。 写代码时一定要注意,指针释放后置空。