ios报ASSERT FAILED ON LUA EXECUTE: key not found : <integer/real>的问题

来源:互联网 发布:品茗网络计划教程 编辑:程序博客网 时间:2024/06/07 11:10

原文 :http://www.cocoachina.com/bbs/read.php?tid=282012


问题出现的原因


DictMaker有以下3个函数,用来处理tinyxml2的visit回调
void startElement(void *ctx, const char *name, const char **atts)
void endElement(void *ctx, const char *name)
void textHandler(void *ctx, const char *ch, int len)
当解析带有utf8 bom头的文件时,会首先调用textHandler这个函数,参数ch就是utf8的bom头:EF,BB,BF,参数len是3,
由于_state没有初始化,所以可能是任一个乱值。而如果恰好_state==SAX_STRING,就会报CCASSERT(!_curKey.empty(), "key not found : <integer/real>")这个错误。

在以往的win平台开发经验中,debug模式下,未初始化的变量为置0,release下未初始化的变量是乱值。但是在我测试的时候,android评上上,debug模式下,未初始化的变量是一个很大的乱值,但release模式下,出现过比较规则的4,5,9,11等等。。。
所以只要在解析带有utf8 bom头的文件时,并且恰好又_state==5,也就是_state==SAX_STRING时,就会报这个错误,并且是偶然发的。

如果解析的文件是没有bom头的话,就不会先执行textHandler,所以就没问题。




解决方案有2种

1.用工具去掉所有plist文件的bom头

2.CCFileUtils.cpp里面的DictMaker类,有一个变量 _state,这个变量没有初始化,在构造函数里将其初始化成SAX_NONE。

阅读全文
0 0
原创粉丝点击