cocos2dx-lua项目中空指针崩溃的问题
在公司的项目维护中,出现大量空指针崩溃问题,例如
sp:setVisible(false)
类似这样的代码,崩溃日志报sp变量为空,C++绑定lua的代码中报崩溃异常。
崩溃日志如下:
[LUA-print] [string "/xxx/src/main.lua"]:270: invalid 'cobj' in function 'lua_cocos2dx_Node_setVisible'
stack traceback:
[string "/xxx/src/main.lua"]:270: in function <[string "/xxx/src/main.lua"]:269>
出现类似异常的还有removeFromParent等方法,但是使用的地方非常多,根据崩溃日志只能确定是例如setVisible在C++绑定的地方错的,但是lua层具体哪一行无法确定。但是是老项目维护,不能改太多代码。因此想出了哪个方法报错就重写哪个方法的办法。
例如setVisible重写,在重写的方法里加上空指针判断。使用tolua.isnull(xx)
源码如下,直接放在cocos2dx_lua的NodeEx.lua下既可:
local overwrite_function_names = {"setVisible", "removeFromParent"}
local function overwrite_node_function(func_name)
if Node[func_name] then
Node["_" .. func_name] = Node[func_name]
Node[func_name] = function(self, ...)
if tolua.isnull(self) then
return
end
return Node["_" .. func_name](self, ...)
end
end
end
for _, func_name in ipairs(overwrite_function_names) do
overwrite_node_function(func_name)
end