undefined

bokuweb.me

cocos2d-JSでネイティブ動作時に"Invalid Native Object"エラーが発生する場合のハック

cocos2d-JSでWeb動作の確認後、ネイティブで動かすと"Invalid Native Object"エラーが発生する場合があります。 これはClass Index | JsDoc Referencecc.Noderetainreleaseに記載がありますがJSBのバグのようで、今のところretainreleaseを使用し回避する必要があるようです。

例えば以下のようなコードの場合、WEBでは動作しますが、ネイティブの場合@addChild @spriteで"Invalid Native Object"エラーが発生すると思います。

GCの発生を減らすため、スプライトなどゲーム開始前に生成しておき、開始後にaddChildすることがあると思いますが、ネイティブの場合JSBによるオートリリースが動作し、生成したスプライトがaddChildする前に解放されてしまうらしいです。 この動作により"Invalid Native Object"エラーが発生します。

回避策としては以下のようにretainを使用し参照カウンタを手動で操作する必要があるそうです。

参照カウンタがretainによりインクリメントされるため、オートリリースによる解放は避けられますが、今度は必ずreleaseを実行し解放してやる必要がでてきます。releaseをし忘れるとメモリリークが発生しますので注意が必要です。 一応これでエラーは回避されるんですが、ドキュメントにも"ugly workaround"と書かれており、根本的な解決としてはJSB側の修正を待つしかなさそうです。また、JSB側が修正された場合、retainreleaseは削除する必要があると記載されています。

*** 2015/06/10追記

参考。公式でも説明がありました。同じようにはまった方もいるようです。

www.cocos2d-x.org

d.hatena.ne.jp