cocos2d-x或coco2d学习之杂谈

来源:互联网 发布:梦幻西游mac打不开 编辑:程序博客网 时间:2024/05/17 07:04

1 所有的new出来的变量,都要加autorelease。

 

2 所有copy的对象也都需要autorelease

 

3 对于继承了CCLayer或者CCScene的类,我们可以编写构造函数也可以不编写

  当我们的类显示的声明了析构函数,我们可以把对象的release操作放在析构函数里,也可以放在OnExit函数里。。例如:

   我们在类的OnEnter或者构造函数里用一个文件创建了一个sprite,而且显示的retain(sprite->retain())

那么我们就可以在OnExit或者析构函数里sprite->release();

 

LAYER_NODE_FUNC(CMyFirstScene)的作用

   这个宏在引擎内部(CCLayer.h)被定义。主要是为自己建的层增加一个node()函数,node()函数的作用是new一个实例,并将它加入autorelease,也就是所有由node()函数得来的指针,都不需要手动的释放

 

5 关于内存

    1)所有retain的变量,最后都要调用release。包括@property中retain的。

这里需要特别注意的是,在@property中retain的变量,在创建的时候必须这样写:

                     self.pSprite = [CCSprite spriteWithFile: ];

否则retain就不会起作用,当你在release的时候就会出现内存错误,当然在其他地方,比如改变pSprite的位置属性的时候,就不用了,直接pSprite就好了。

    2)所有alloc的变量,都必须调用release,例如[NCName alloc] init];

    3)在创建变量的时候,也可以autorelease一下,例如:

          [[[MCName alloc] init] autorelease];

 

6 CCLayer如何指定显示区域

   void visit()//此方法为绘制时调用,系统每帧调用

   {

       glEnable(GL_SCISSOR_TEST);
       glScissor(0, 0, 100, 100);//x, y, w, h  
       CCSprite::visit();//调用自己的类方法,这里一般写为[super visit]

       glDisable(GL_SCISSOR_TEST);

    }

 

7 关于CCCallBlock

    用CCFuncBlock可以不用传参数,代码简洁高效,函数内临时变量如果不retain,不存在跳出函数使用域后被回收情况(推荐)

    CCCallBlock *block = [CCCallBlock actionWithBlock:^{
            
//回调方法在一个函数循环内3个好处:
          1.不用传递(void *)参数,所以convertedLocation不需要封装,
          2.传递指针类型变量(非alloc或copy)也不需要retain,
          3.alloc或copy方式产生的参数,函数内释放,省去函数外手动释放的麻烦。
            [self flightBezier:convertedLocation];
            }];
    [flight runAction:[CCSequence actions: ac1, block, nil]];

    当然这里要执行的动作或是函数也可以利用参数传递,例如:

    -(void) show: (void(^))callBackBlock{

          id action = [CCCallBlock actionWithBlock: callBackBlock];

          flight runAction:[CCSequece actions: ac1, action, nil];   

    }

    传递的时候:[self show:(^(void){

                     //do something

                 })]

原创粉丝点击