LuaそしてCoronaでグローバル変数は色々な問題の原因となります。
そしてLuaの構成上でも、実はパフォーマンスにも良くはありません(とは言え普通のアプリで変数をグローバルにしたことでパフォーマンス悪影響は大したことない)。
他にグローバル変数の悪影響はこのCoronaブログの記事にも書いてあります:
http://coronalabs.com/blog/2013/05/28/tutorial-goodbye-globals/
では今回の本題、グローバル変数を捕まる手法、に入りましょう。
自分はグローバル変数を極力使わない派ので、自分はいつもmain.luaの先頭にこのpatchを当てます。これをすれば誰かどこかでグローバル変数を使ったのはすぐ捕まえる!
patch.lua
local _KNOWN_GLOBALS = {
_scrollview = true,
imageSheet = true,
LuaLibStore = true,
facebook = true,
socket = true,
store = true,
launchPad = true,
crypto = true,
lfs = true,
--など...
--外部モジュールはたまにGlobalに変数を定義するので、一旦無視をしたい変数をこちらに追加
}
setmetatable(_G, {
__index = function( t, k )
if _KNOWN_GLOBALS[k] then
return
end
print("ERROR", debug.traceback("access of undefined global "..tostring(k), 2))
_KNOWN_GLOBALS[k] = true
end,
__newindex = function( t, k, v )
rawset(t, k, v)
if _KNOWN_GLOBALS[k] then
return
end
print("WARN", debug.traceback("creating new global "..tostring(k).."="..tostring(v), 2))
end
})
自分はこのちょっとしたコードのおかげで何回か救われたことあるので是非使ってみてください!