Sprite :: create()

时间:2016-06-11 08:12:04

标签: c++ cocos2d-x

我开始使用cocos2d-x并遇到问题。下面的代码会在s->getChildrenCount();处引发读取访问冲突错误。

HelloWorldScene.h

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();
    void update(float) override;
    CREATE_FUNC(HelloWorld);

private:
    cocos2d::Sprite* s;
};

HelloWorldScene.cpp

Scene* HelloWorld::createScene()
{
    auto scene = Scene::create();
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
bool HelloWorld::init()
{
    if ( !Layer::init() )
    {
        return false;
    }

    s = Sprite::create();
    this->scheduleUpdate();
    return true;
}
void HelloWorld::update(float delta)
{
    int k = s->getChildrenCount();
    ...
}

我的猜测是s变成了悬空指针,它与引用计数有关。我读了引用计数的工作原理,但我并没有完全理解它。

如何在init结束时销毁精灵?谁在做呢?

解决此问题的正确方法是什么?在s->retain()之后Sprite::create()并在HelloWorldScene添加s->release()析构函数?如果我这样做,我看不到使用传统C ++ newdelete的好处。

1 个答案:

答案 0 :(得分:0)

首先,没有悬空指针,但创建的指针不再存在,s现在是nullptr。这就是您尝试访问getChildrenCount()方法时出现访问冲突错误的原因。

使用create()方法创建的对象将被评估为在它们创建的方法结束时立即释放。这意味着如果对象没有引用且未标记为要保留,则将解构创建的对象。如果您希望更改此行为,则必须分别调用retain和release,就像您已经完成的那样。

与使用s->retain()s->release()相比,newdelete或一般参考计数的好处之一是您不必担心数据你班外的会员资格即。 当您调用delete时,您确定资源不再在任何地方使用吗?通过使用引用计数和保留/释放机制,这个问题变得不必要了。