removeSpriteFrames()后crash的问题

原文:http://blog.csdn.net/tangaowen/article/details/10715221
暂时转载,后续完全解决跟进。
在使用 DragonBones的 
Armature  对象的过程中,发现如果调用  
CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames(); 释放所有的frames纹理后,再去创建  Armature的时候,会crash


//调用过程
cs::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo
cs::Armature::create("filename");


会发现crash在  CCSprite的 spriteWithFrameName函数里面,猜测是没有了  
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile
去加载plist文件的过程,所以崩溃了。


阅读 相关的代码发现,最终是在
cs::ArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo 里面,调用了
m_pArmatureFileInfoDic->setObject,这个
m_pArmatureFileInfoDic就是保存的相关的信息。


当  
ArmatureFileInfo *ArmatureDataManager::getArmatureFileInfo()函数被调用的时候,就返回相应的ArmatureFileInfo 


最后调用  
addSpriteFrameFromFile(plistPath, imagePath,string(armatureName));


这个就是资源加载的地方,但是奇怪的是,这个加载资源的地方,是每次都执行的,那么原因就不是这里了。


后面发现是
addArmatureFileInfo
开始的地方,调用了 
ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);


  if(!fileInfo)
    {
        fileInfo = ArmatureFileInfo::create();
        fileInfo->armatureName = armatureName;
        fileInfo->configFilePath = configFilePath;
        fileInfo->useExistFileInfo = useExistFileInfo;
        


        if (fileInfo->useExistFileInfo.compare("") != 0)
        {
            fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(fileInfo->useExistFileInfo);
        }
        
        
        m_pArmatureFileInfoDic->setObject(fileInfo, fileInfo->armatureName);
    }


这个意思是,如果 m_pArmatureFileInfoDic->objectForKey返回NULL的时候,才去m_pArmatureFileInfoDic->setObject ,猜测错误的原因是没有 执行这个,于是将开始的时候的


ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);
注释,替换成如下的代码:


    //ArmatureFileInfo *fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(armatureName);
    ArmatureFileInfo *fileInfo = NULL;
    
    
    if(!fileInfo)
    {
        fileInfo = ArmatureFileInfo::create();
        fileInfo->armatureName = armatureName;
        fileInfo->configFilePath = configFilePath;
        fileInfo->useExistFileInfo = useExistFileInfo;
        


        if (fileInfo->useExistFileInfo.compare("") != 0)
        {
            fileInfo = (ArmatureFileInfo*)m_pArmatureFileInfoDic->objectForKey(fileInfo->useExistFileInfo);
        }
        
        
        m_pArmatureFileInfoDic->setObject(fileInfo, fileInfo->armatureName);
    }


结果发现work 了,于是,出现错误的原因找到了,可能在调用CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFrames()的过程中,m_pArmatureFileInfoDic里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值