Titaniumでlocal reference table overflowが出た時の対処法


Titanium-androidで原因不明で突然落ちることがあって、
それも普段はうまくいっているのに、数が増えてくると落ちる
みたいな現象を調査していたところぶち当たりました。

原因

「local reference table overflow」
よくみたらこんな文字がエラーログに載っていたので、検索してみると、どうもローカル参照がどうのこうのということでたくさんヒットします。結構昔のブログやTitanium界隈の有名なお方のツイートとかもあるので、結構メジャーなバグのようです。
#TitaniumというかAndroidの?

結論としてはどうも、下記のような感じで
現在画面に表示しているものプロパティにループで参照していると、
数が増えた時にアウトになってしまうようです。
:厳密には違うのかもしれませんが・・

for (var i in view.children) {
    var p = view.children[i].rect.height;
    
}

rect.height以外にもdisplayCapsなどでもダメなので、
あれはダメこれはダメと、きっとプロパティによって
メモリの使い方が違うんでしょう。

対処法

これを思いつくまでハマりまくりましたが、思いつけば非常に簡単で、
直接表示しているものへの参照をはずせばいいだけなんです。

var children = view.children;
for (var i in children) {
    var p = children[i].rect.height;
    
}

こんな感じでコピーして表示しているものを直接参照しなければうまく動きます。
なんかメモリもったいない気がしますが気にしない。

scrollviewの全子供viewの高さを知りたかった自分は
非常に苦戦しました。。


Leave a Reply