1 所有的new出来的变量,都要加autorelease。
2 所有copy的对象也都需要autorelease
3 对于继承了CCLayer或者CCScene的类,我们可以编写构造函数也可以不编写
当我们的类显示的声明了析构函数,我们可以把对象的release操作放在析构函数里,也可以放在OnExit函数里。。例如:
我们在类的OnEnter或者构造函数里用一个文件创建了一个sprite,而且显示的retain(sprite->retain())
那么我们就可以在OnExit或者析构函数里sprite->release();
4 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
})]