Creator源码中的Camera实例保存的问题,及内存泄露

使用Creator一个月,各种不熟。但是使用中发现一个奇葩问题。
由于游戏中一个场景使用Camera。所以在这个场景中添加了一个Camera。但是使用iOS调试的时候发现奇葩问题。频繁切换Scene的时候。进入到有Camera的场景发现一些元素被culling掉了。花了半天看了看源码。发现一个问题。直接贴代码。

这是在CCCameraNode.cpp中的代码。我加入一个变量来修复这个问题。

CameraNode::CameraNode()
{
    _mat.setIdentity();
    _cameraInstance = this;
    ++_instanceCount;
    cocos2d::log("camera Instance create");
    visitingIndex = 0;
}

CameraNode::~CameraNode()
{
    if (!_commands.empty())
    {
        for (const auto& c : _commands)
        {
            delete c.beforeVisitCommand;
            delete c.afterVisitCommand;
        }
        _commands.clear();
    }
   // 修复camera释放错误问题
    cocos2d::log("camera Instance release");
    --_instanceCount;
    if (_instanceCount == 0) _cameraInstance = nullptr;
}

由于在js层对象释放是延迟的。这里在C++层的Camera释放直接将instance设置成空。就会出现,在切换scene的时候,js层的Camera延迟释放,然后新创建了一个Camera,这时候,instance保存的是新的实例没错,但是等到js层的release到来的时候instance变成空。但是其实在js里面camera对象是还在的。释放老的camera导致这个全局对象没了。在render里面导致取不到camera,culling出错。

还有发现两个leak。
CCNode的_beforeVisitCallback和_afterVisitCallback被new了之后没有delete。
在CCDownloader-apple.mm中的taskDict没有在dealloc中设置成nil,在iOS的leak测试中会出现leak,这里猜测是不是那里有循环引用。由于没太多时间就没有深究。