読者です 読者をやめる 読者になる 読者になる

フニゲの開発日記

Electronとか...

Invalid Native Object

cocos2d-html5


 公式に書いてある通りなんだけど、なかなか厄介なメモリ管理の問題。

Memory Management of JSB

 Cocos2d-x (C++) のメモリ管理はiOS開発者にはおなじみのretainカウント方式なのだが、javaScriptバインディングではほとんど意識することがないように、うまく隠されている。しかし隠しきれる秘密など無いのだな。

init:function () {
    this.pauseMenu = cc.Node.craete();
    ...

onPause:function () {
    this.addChild(this.pauseMenu); // ここでエラーが出る
},

 メモリを確保したときは非表示にしておいて、後で使いたいときにaddChildして画面に表示しようとしても、Invalid Native Objectというエラーが出る。必ず出るわけでもないのかな。
 Cocos2d-html5は全部JavaScriptで書かれているので、thisが生きているのにthis.nodeだけ消えることなんてあり得ないのだが、これをCocos2d-xに持って行くと動かない。

jsb: ERROR: File .../scripting/javascript/bindings/generated/jsb_cocos2dx_auto.cpp: Line: 3010, Function: js_cocos2dx_CCNode_addChild
Invalid Native Object

 対策としては、どこか見えないところにaddChildしておくか、retainとreleaseを使う。

    init:function () {
        this._super();
        this.pauseMenu = cc.Node.create();
        this.pauseMenu.retain();
        ...

    onExit:function() {
        this.pauseMenu.release();
        this._super();
    },

 これは面倒くさい。

広告を非表示にする