项目升级到了quick3.3 现在遇到了很多闪退的情况,粗略查了下,大部分是由于LuaTouchEventManager.cpp这个文件中LuaTouchEventManager类的onTouchesBegan函数在分发touch事件时引起的。
quick3.3写了一套自己的触摸事件管理机制,在lua层创建的Node的touch事件都是注册到LuaTouchEventManager来管理,当Node的cleanup消息触发时,lua层会去LuaTouchEventManager移除touch回调,
这时就遇到一个问题,当建立的Node没有加到父级(比如lua代码遇到错误),Node是不会收到cleanup消息的,这时候lua层的Node已经析构,c++层的Node也delete了,但注册的回调还在LuaTouchEventManager中
没有被remove掉,这时onTouchesBegan消息分发时候访问野指针直接就崩溃了。
虽然找到了原因,但也没想到好的解决方法,现在唯一的方法就是保证lua层代码不能出错,不能出现有Node没有加到父级中去。
一个马上能重现的的方法就是在Scene的ctor中写这样一行display.newLayer()。运行随便点几次界面就能崩溃。因为quick3.3的newLayer是用Node模拟的,而且默认开启setTouchEnabled,这个Layer没有加入到Scene中,ctor函数结束是Layer马上被删除,
但LuaTouchEventManager的touch回调没有被清除。