这个牵扯到Sprite的计数和渲染机制,cocos2d采用的是引用计数,这个是最基本的,除了手动retain当然如果已经被layer->addchild调用了,他会自动retain一次,直到你手动release,但是如果没有被调用,而你又忘了retain,最后报错了,又不是空,这个看哪呢?

这个就需要看哪个m_pobTexture是不是为空了

屏幕快照 2015-03-11 上午10.28.15.png

这个是正常的状态,而下面这个则是没有retain但是却直接调用了的状态

屏幕快照 2015-03-11 上午10.37.04.png

没有retain时,是空的,就是null.为什么要看这个呢?

这个就和Sprite的渲染机制有关系了,点击进入Sprite的draw函数

里面开始时这样的

CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw");

    CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");

    CC_NODE_DRAW_SETUP();

    ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst );

    ccGLBindTexture2D( m_pobTexture->getName() );
    ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );

所以如果你没有retain,这个参数m_pobTexture就是空的,就会出错,所以也是提供一个看有没有retain的一个方法,因为如果这个出错的时候,有的时候报错并不是地址为空,但是还是崩溃,所以特别坑爹


☟☟可点击下方广告支持一下☟☟

最后修改:1970 年 01 月 01 日
请我喝杯可乐,请随意打赏: ☞已打赏列表