didLoadFromCCB方法的调用顺序

来源:互联网 发布:德军 知乎 编辑:程序博客网 时间:2024/06/17 21:51

该方法运行顺序和其(包含)继承体系顺序的逆序相同.

这意味着孩子的didLoadFromCCB将总是在其父的didLoadFromCCB之前调用.

比如GameScene.ccb中含有GameMenuLayer.ccb文件,则可认为前者是后者的父亲,后者是前者的儿子.前者有一个ivar _gameMenuLayer指向一个GameMenuLayer类的实例;后者的实例中也有一个ivar _gameScene指向一个前者的实例.

在这个例子中,如果我们编写GameMenuLayer类和GameScene类中的didLoadFromCCB实例方法分别如下:

//代码段0//In GameMenuLayer.m-(void)didLoadFromCCB{    CCLOG(@"enter didLoadFromCCB method : %@",self);    //do anything you want...}//代码段1//In GameScene.m -(void) didLoadFromCCB{    _gameMenuLayer.gameScene = self;}

则这意味着代码段0的初始化方法会先于代码段1的方法调用,即在GameMenuLayer的didLoadFromCCB方法调用时,其_gameScene实例变量还未初始化.在GameMenuLayer中的所有需要有效_gameScene实例变量的代码都需要延后执行———-比如说,放到onEnter方法中运行.

如果你需要在GameMenuLayer实例中快速引用GameScene实例对象,你可以通过以下代码来完成;不过以下代码要在除节点init和didLoadFromCCB方法之外的地方调用,因为这些地方self.scene总为nil:

GameScene *tmp = (GameScene*)self.scene.children.firstObject;

我们可以在GameMenuLayer的onEnter方法中尝试一下:

-(void)onEnter{    [super onEnter];    GameScene *tmp = (GameScene*)self.scene.children.firstObject;    CCLOG(@"in %@ : **** %@ must equ %@ ****!",NSStringFromSelector(_cmd),          tmp,_gameScene);}

输出如下:

2015-09-26 18:25:37.801 LearnSpriteBuilder[6587:231964] in onEnter : **** <GameScene = 0x7b1b1720 | Name = > must equ <GameScene = 0x7b1b1720 | Name = > ****!
0 0
原创粉丝点击