原文: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里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。
暂时转载,后续完全解决跟进。
在使用 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里面的相关数据被损坏,但是没有被移除,现在写成每次都重新设置一遍,就没有任何问题了。