1、偶遇ReferenceTable overflow
出现场景:因为频繁对socket的往返数据通过JNIHelper进行了decryptDES和encryptDES操作,导致java的垃圾回收出现异常,引用计数溢出。
解决方案:进行jni操作后记得释放
参考文档:http://www.ibm.com/developerworks/cn/java/j-lo-jnileak/index.html?ca=drs-
if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
JniMethodInfo mInfo;
bool hasMethod = JniHelper::getStaticMethodInfo(mInfo, ANDROID_HELPER_CLASS,
"encryptDES", "([B)[B");
jbyte *by = (jbyte*)data;
jbyteArray jbyteArr; //定义jbyte数组
jbyteArr = mInfo.env->NewByteArray(len);
mInfo.env->SetByteArrayRegion(jbyteArr, 0, len, by);
jobject ret;
if (hasMethod)
{
ret = mInfo.env->CallStaticObjectMethod(mInfo.classID, mInfo.methodID, jbyteArr);
jbyteArray array = (jbyteArray)ret;
jsize numBytesEncrypted = mInfo.env->GetArrayLength(array);
// const void* data = (const void*)mInfo.env->GetByteArrayElements(array, 0);
jbyte * jdata = (jbyte*)mInfo.env->GetByteArrayElements(array, 0);
if(jdata)
{
DataBlock* dataBlock = new DataBlock((const void*)jdata, (unsigned int)numBytesEncrypted);
mInfo.env->ReleaseByteArrayElements(array, jdata, 0); //JNI释放
return dataBlock;
}
}
#endif
2、使用多线程,应避免在非主线程中使用autorelease,这是非线程安全的操作,可能出现空指针。如果一定要使用,建议用建立消息队列机制,在主线程使用
3、碰到cocosbuilder too many directories
出现场景:cocosbuilder加文件夹后无法打开,出现上述提示。那是因为cocosbuilder定义了kCCBMaxTrackedDirectories 50,也就是你的文件夹上限为50,超过了就会出现错误提示。
解决方案:改源码
参考文档:http://blog.youkuaiyun.com/playddt/article/details/11609679
下载路径:http://download.youkuaiyun.com/download/wangting/6926059(用别人下载好的快点,不用配置很多东西)
4、cocosbuilder尽可能不使用ccb插件,在多个ccb文件同时在一个类中容易引发各种让你痛苦的事情
5、scrollView中的CCControlButton在滚动过程容易点到
解决方案:修改CCControlButton.cpp,在ccTouchMoved里面加上简单的判断标记,用于阻止sendActionsForControlEvents,为了保证点击灵敏度,手指的小距离移动还是运行存在的。
if(ccpDistance(pTouch->getLocation(), pTouch->getStartLocation()) > MOVE_LIMIT)
{
mIsMove = true;
}
最后改下ccTouchEnded,把button的状态改成CCControlStateNormal即可
void CCControlButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
m_isPushed = false;
setHighlighted(false);
if (mIsMove) {
m_eState = <span style="font-family: Arial, Helvetica, sans-serif;">CCControlStateNormal</span>;
mIsMove = false;
return;
}
if (isTouchInside(pTouch))
{
sendActionsForControlEvents(CCControlEventTouchUpInside);
}
else
{
sendActionsForControlEvents(CCControlEventTouchUpOutside);
}
}
6、某些action并没有修改到目标对象的透明度
出现场景:一个CCLayer使用CCFadeIn,无任何效果
解决方案:看了一下源码注释有这么一句Fades In an object that implements the CCRGBAProtocol protocol.
ps(原以为setOpacity能同时修改子节点,最后发现不行,只能重写setOpacity,通过递归遍历子节点)