cocos2d-JSでWeb動作の確認後、ネイティブで動かすと"Invalid Native Object"エラーが発生する場合があります。
これはClass Index | JsDoc Referenceのcc.Node
のretain
、release
に記載がありますがJSBのバグのようで、今のところretain
、release
を使用し回避する必要があるようです。
例えば以下のようなコードの場合、WEBでは動作しますが、ネイティブの場合@addChild @sprite
で"Invalid Native Object"エラーが発生すると思います。
GCの発生を減らすため、スプライトなどゲーム開始前に生成しておき、開始後にaddChild
することがあると思いますが、ネイティブの場合JSBによるオートリリースが動作し、生成したスプライトがaddChild
する前に解放されてしまうらしいです。
この動作により"Invalid Native Object"エラーが発生します。
回避策としては以下のようにretain
を使用し参照カウンタを手動で操作する必要があるそうです。
参照カウンタがretain
によりインクリメントされるため、オートリリースによる解放は避けられますが、今度は必ずrelease
を実行し解放してやる必要がでてきます。release
をし忘れるとメモリリークが発生しますので注意が必要です。
一応これでエラーは回避されるんですが、ドキュメントにも"ugly workaround"と書かれており、根本的な解決としてはJSB側の修正を待つしかなさそうです。また、JSB側が修正された場合、retain
、release
は削除する必要があると記載されています。
*** 2015/06/10追記
参考。公式でも説明がありました。同じようにはまった方もいるようです。