随意定义一个Cocos2d::Array并存入数据,在onTouchBegan()中array->count()就会报错不再触屏事件中访问就不会报错,是什么原因?
定义后retain一下,注意自己释放,3.x好像就没有array了,__array没用了,习惯一下容器,map就好了
多谢指点retain()后还是报错,cocos2dx版本是3.7.1。换成Vector可以访问,但是目前需求是Cocos2d::Map<std::string, Cocos2d::Array*>,而不能用成Cocos2d::Map<std::string, cocos2d::Vecdtor<>>,所以很纠结
用ValueVector和ValueMap
参考下这个帖子,写得挺逗 http://blog.csdn.net/star530/article/details/37834689
如果还不能解决,请把意图和相关小片段代码写出,再交流
我 还没掌握清楚,还是先不总结了,呵呵:5:
解决了,Array是定义在一个继承Object的类中,把这个类retain()就能在touch事件中正常访问了Array了。但是不清楚原因
应该是这个类对象被释放
cocos2dx内存管理的原因。cocos2dx采用引用计数来管理内存,对象每次retain时引用计数+1,每次release时引用计数-1,当引用计数为0时,delete释放该对象。继承于CCObject(Ref)的类在创建create的时候都会引用自动引用计数方法autorelease(将引用计数初始化为1),将创建的对象放入内存管理池中。在下一帧渲染的时候就释放掉这个内存管理池,此时该被添加到内存管理池中的对象就会全部release一次(引用计数-1,引用计数为0就释放)。所以当一个对象创建出来时,如果没有自身引用retain方法或者被其他对象管理(即添加为子对象,addchild,addobject等),就会在创建出来的下一帧释放掉。addchild方法中其实也是使用retain方法,remove的时候引用release方法,父节点析构时也会调用子节点的release方法。
— Begin quote from ____
引用第7楼yong224于2015-08-20 14:05发表的 回 5楼(finalsun) 的帖子 :
cocos2dx内存管理的原因。cocos2dx采用引用计数来管理内存,对象每次retain时引用计数+1,每次release时引用计数-1,当引用计数为0时,delete释放该对象。继承于CCObject(Ref)的类在创建create的时候都会引用自动引用计数方法autorelease(将引用计数初始化为1),将创建的对象放入内存管理池中。在下一帧渲染的时候就释放掉这个内存管理池,此时该被添加到内存管理池中的对象就会全部release一次(引用计数-1,引用计数为0就释放)。所以当一个对象创建出来时,如果没有自身引用retain方法或者被其他对象管理(即添加为子对象,addchild,addobject等),就会在创建出来的下一帧释放掉。addchild方法中其实也是使用retain方法,remove的时候引用release方法,父节点析构时也会调用子节点的release方法。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=319901&pid=1373168
— End quote
如果没有自身引用retain方法或者被其他对象管理,就会在创建出来的下一帧释放掉 ,请问一下,下一帧是什么时候调用或者是什么机制?谢谢了
看void DisplayLinkDirector::mainLoop()和void Director::drawScene()
安卓整个跨平台调用可以看http://blog.xulingmin.com/cocos2d-x%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E8%B7%A8%E5%B9%B3%E5%8F%B0/
好呢,太感谢啦