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

原文 :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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值