Invalid native object

问题好像比较复杂下面贴代码,我实在改不出来,改了一星期,web可以用,用cocos 打包APK就报错
var SCORE=0;
var gameLayer = cc.LayerColor.extend({
checkCollide:false,
length:0,
zx:null,
radius:20,
score:0,
LV:1,
ctor:function (gamesceneinfo) {
//////////////////////////////
// 1. super init first
this._super();
GC.copy(gamesceneinfo,this);
this.allBall=[];
this.playerBall=[];
this.oneP=cc.p(0,0);
GC.setSize(cc.winSize);
var size = cc.winSize;
this.setColor(cc.color(147,147,147,255));//背景色

    var score=new cc.LabelTTF("积分 "+SCORE+"","",30);
    this.addChild(score);
    score.setPosition(GC.w-5,GC.h-15);
    score.setAnchorPoint(1,1);
    this.score=score;

    var lv=new cc.LabelTTF("关卡 "+this.LV+"","",30);
    this.addChild(lv);
    lv.setPosition(0,GC.h-15);
    lv.setAnchorPoint(0,1);
    this.lv=lv;

    //转轴中心
    var zx=this.createBall(this.radius*4);
    var zxp=GC.z;
    zxp.y+=100;
    zx.setPosition(zxp);
    var rot= cc.rotateBy(gamesceneinfo.rotationSpeed,360);
    var fore= cc.repeatForever(rot);
    zx.runAction(fore);
    this.addChild(zx);
    this.zx=zx;



    //关卡文字
    var LVL=cc.LabelTTF.create(gamesceneinfo.LV+"","",60);
    LVL.setPosition(zx.getPosition());
    LVL.setColor(cc.color(0,0,0,255));
    this.addChild(LVL);


    var y=zxp.y-230;
    this.oneP=y;
    for(var i=1;i<=gamesceneinfo.playerBall;i++){
        var coball=this.createBall(this.radius,i);
        coball.x=GC.w_2;
        coball.y=y-(this.radius*2+4)*i;
        this.addChild(coball);
        this.playerBall.push(coball);
    }

    var meigeangle=parseInt(360/gamesceneinfo.collideBall);
    var length=200;
    this.lenght=length;
    for(var i=0;i<gamesceneinfo.collideBall;i++){
         var ma=GC.mathAngle(i*meigeangle);
        var coball=this.createBall(this.radius);
        coball.x=ma.first*length;
        coball.y=ma.second*length;
       this.addBallInZX(coball);
    }

    cc.eventManager.addListener({
        event: cc.EventListener.TOUCH_ONE_BY_ONE,
        swallowTouches: true,
        onTouchBegan: this.onTouchBegan,
        onTouchMoved: this.onTouchMoved,
        onTouchEnded: this.onTouchEnded,
        onTouchCancelled : this.onTouchCancelled
    }, this);
    this.scheduleUpdate();
    return true;
}

,onTouchBegan:function(touch, event){
    var target =event.getCurrentTarget();
    if(target.playerBall.lenght<=0)
    return;

    var lastp=cc.p(0,0);
    for(var i=0;i<target.playerBall.length;i++){
        var ball = target.playerBall[i];
        if(i==0) {
            lastp=ball.getPosition();
            var bp = target.zx.convertToNodeSpace(cc.p(GC.w_2, target.zx.y - target.lenght));
            ball.setPosition(bp);
           // cc.log(ball)
            ball.removeFromParent();
            //target.addBallInZX(ball);
           /* target.allBall.push(ball);
            target.zx.addChild(ball);
            target.zx.drawnode.drawSegment(cc.p(0, 0), cc.p(ball.x,ball.y), 1,cc.color(255, 255, 255, 255));//线的颜色
            for(var a=0;a<target.allBall.length-1;a++){
                var q = target.allBall[a];
                var p=q.getPosition();
                if(cc.pDistance(p,ball.getPosition())<target.radius*2){
                    target.gameOver(ball);
                    return;
                }
            }
            if(target.playerBall.length<=1){
                target.gameWin();
            }  */
        }
               
        else{
            var nowp=ball.getPosition();
            ball.runAction(cc.moveTo(0.1,lastp));

// ball.setPosition();
lastp=nowp;
}

    }
    target.playerBall.splice(0,1);
    return true;
},
onTouchMoved:function(touch, event){

},
onTouchEnded:function(touch, event){

},
onTouchCancelled:function(touch, event){

},
addBallInZX:function(coball){
    coball.retain(); // 提出来
    this.allBall.push(coball);
    this.zx.addChild(coball);
    coball.scheduleUpdate();
    this.zx.drawnode.drawSegment(cc.p(0, 0), cc.p(coball.x,coball.y), 1,cc.color(255, 255, 255, 255));//线的颜色
    for(var i=0;i<this.allBall.length-1;i++){
        this.allBall[i].retain();
        var p=this.allBall[i].getPosition();    //b报错的地方     得不到本地对象,但是web可以用cc.log打印出来
        if(cc.pDistance(p,coball.getPosition())<this.radius*2){
            this.gameOver(coball);
            return;
        }
    }
    if(this.playerBall.length<=1){
        this.gameWin();
    }   
    
},
update:function(){
    if(!this.checkCollide)
        return;
},
gameOver:function(target){
    this.zx.pause();
    this.setColor(cc.color(255,0,0,255));//失败背景色
    cc.eventManager.removeAllListeners();
    var action=cc.sequence(
        cc.scaleTo(0.2,1.3),
        cc.scaleTo(0.2,1),
        cc.scaleTo(0.2,1.3),

// cc.scaleTo(0.5,1),
cc.callFunc(function(){
var tar=new cc.LayerColor(cc.color(155,155,155,205));//失败背景色
this.addChild(tar);

            var scorestart=new cc.MenuItemFont("继续",function(){
                if(SCORE<5)
                    return;
                this.toLV(this.LV);
            },this);
            scorestart.setColor(cc.color.BLACK);
            var restart=new cc.MenuItemFont("重新开始",function(){
                this.toLV();
                SCORE = 0;
            },this);
            restart.setColor(cc.color.BLACK);
            var menu=new cc.Menu(scorestart,restart);
            this.addChild(menu);
            menu.alignItemsVerticallyWithPadding(20);

        },this)
    );
    target.runAction(action);
},
toLV:function(LV){
    cc.director.runScene(new gameScene(LV));
},
gameWin:function(){
    this.setColor(cc.color(0,255,0,255));//背景颜色
    var allballs=this.allBall;
    var self=this;
    this.zx.update=function(){
        this.drawnode.clear();
        this.drawnode.drawDot(cc.p(0,0), self.radius*4,cc.color(255, 255, 255, 255));//球
        for(var i=0;i<allballs.length;i++){
            var ball=allballs[i];
            ball.x*=1.05;
            ball.y*=1.05;
            this.drawnode.drawSegment(cc.p(0, 0), cc.p(ball.x,ball.y), 2,cc.color(255, 255, 255, 255));
        }
    };
    this.zx.scheduleUpdate();
    this.scheduleOnce(function(){
        this.LV++;
        SCORE+=this.addScore;
        this.score.setString(SCORE+"");
        this.toLV(this.LV);
    }.bind(this),2);
    cc.log("gameWin");
},
createBall:function(width,num,fontSize){
    var self=this;
    var node=new cc.Node();
    node.drawnode=new cc.DrawNode();
    node.addChild(node.drawnode);
    //drawnode.drawCircle(cc.p(0,0),widht, angle, segments, drawLineToCenter, lineWidth, color)
    node.drawnode.drawDot(cc.p(0,0), width,cc.color(255, 255, 255, 255));//球的颜色
    node.update=function(dt){

    };
    if(num) {
        var LVL = cc.LabelTTF.create(num + "", "", 20);
        LVL.setPosition(0, 0);
        LVL.setColor(cc.color(0, 0, 0, 255));//数字的颜色
        node.addChild(LVL);
        node.update=function(dt){
            LVL.setRotation(360-self.zx.getRotation());
        }
    }

    return node;
}

});

var gameScene=cc.Scene.extend({
ctor:function(LV){
this._super();
var gameinfo=gameSceneInfos.create(LV);
var game=new gameLayer(gameinfo);
this.addChild(game);
}
});

我是retain 加 release解决的

这应该发到cocos2d js 板块上去
1、你没意识到这是jsb层上的报错
2、楼上哥们能解决你的问题
3建议看下自动绑定跟手动绑定的原理

能说具体点嘛,大二实习小菜鸡,什么都不懂

谢谢0.0.0.0.0

。。这个说起来就多了(我不会看你代码的,所以你说的具体点我不明白什么意思→_→),我希望你能自己掌握方法解决,就是C++底层的对面已经被释放了,但是还是在js层使用了那个对象,造成Invalid native object,retain一下下一帧还需要用的对象,relase掉不再需要使用的对象。

具体的介绍你需要看一下cocos2d-js的内存管理。这个错误确实是在jsb下才会有,h5不会出现。

大概的情况是,如果你创建了一个cocos的对象但是没有立刻把它add到界面上,那么它就会在这一帧结束的时候被释放掉。避免这个情况出现,就得手动在创建它的时候调用它的retain(),不需要它的时候调用release();

PS:如果你实在搞不懂,可以试试cocos2d-3.11版本新增的内存管理模型,它可以自动管理内存,不用再理会retain/release了。详情可以看一下更新公告

简单看了一下你的代码(没仔细看,所以仅供参考),猜测可能是在创建this.allBall里面的元素的时候,要对那个元素进行retain吧……不知道是不是createBall里面return的那个node(因为我似乎没看到你贴出的代码里有this.allBall.push()相关的内容)

onTouchBegan:function(touch, event){
var target =event.getCurrentTarget();
if(target.playerBall.lenght<=0)
return;

var lastp=cc.p(0,0);
for(var i=0;i<target.playerBall.length;i++){
    var ball = target.playerBall[i];
    if(i==0) {
        lastp=ball.getPosition();
        var bp = target.zx.convertToNodeSpace(cc.p(GC.w_2, target.zx.y - target.lenght));
        ball.setPosition(bp);
       // cc.log(ball)
     **   ball.removeFromParent();**

在移除之前先retain() 加到舞台后再release() ;

//target.addBallInZX(ball);
/* target.allBall.push(ball);
target.zx.addChild(ball);

移除和添加并不一定在同一帧里被执行。。。 修改这个应该就没问题了

谢谢,真解0.0