上QQ阅读APP看书,第一时间看更新
3.1 create和retain-release
这是一位自称有8年C++经验的“大牛”犯下的低级错误,错误是这样产生的,在初始化时使用create方法创建了一个动画对象,在初始化函数中进行测试,这个动画是可以正常播放的。
根据需求,需要在对象被攻击到时播放这个动画,于是将动画对象作为成员变量,在init中使用create方法创建动画对象,初始化后并赋值给成员变量。
将播放动画的代码迁移至update的逻辑中,在触发相应的事件时,播放动画,但运行后就崩溃了,原因是动画对象被释放了。
因为使用create方法创建出来的对象的release在这一帧会被Cocos2d-x调用,如果不希望它被释放,请确保你执行了retain操作。执行之后调用release操作来释放,确保没有内存泄漏。更多关于内存的问题可以参考第7章。
解决这个问题有两种方法,第一种是在每次需要使用一个对象的时候,才调用create方法进行创建,Cocos2d-x中大部分情况下都是这样使用的。第二种是在初始化时创建一次,然后调用对象的retain方法,以避免该对象在外部被释放,后在不需要使用该对象时,调用对象的release方法,以避免内存泄露。
注意:文中retain指执行retain(引用)操作,或调用retain(引用)操作。rease指执行release(释放)操作,调用release(释放)操作。后面为表述方便,直接用retain和release来表达。