关于在共享实例中保留游戏层

时间:2014-01-31 06:36:03

标签: cocos2d-iphone

我在互联网上发现了多级应用程序的样本,(比如选择级别时切断绳索)

有共享实例对象,NSObject是游戏大脑,存储游戏逻辑

    @interface GameData : NSObject {

    ObjLevelInfo *levelInfoArray[MAX_LEVEL_NUMBER]; // array to store level info
    int _curLevelIndex;         // current playing level number, local
    int _curScore;              // current score, local
    CCLayer *_curGameLayer;     // link to current Game Layer, local

}

@property (nonatomic) int curLevelIndex;             // current playing level number
@property (nonatomic) int curScore;                  // current score
@property (nonatomic, retain) CCLayer *curGameLayer; // link to current Game Layer

curGameLayer用于存储当前运行的图层。

还有几个游戏场景CCLayer课程。 在这些类的init方法中我找到了

-(id) init
{
    if( (self=[super init])) {

        //make sure you call this to correctly link GameData with this game layer
        [[GameData sharedInstance] setCurGameLayer:self];
...

这会在每次加载新场景时发生,我想知道它是否可能是泄漏源?当游戏数据保留新场景时,场景会从内存中移除吗?

更新

如果我删除@property (nonatomic, retain) CCLayer *curGameLayer;属性并[[GameData sharedInstance] setCurGameLayer:self];此链接,并在游戏数据中使用

,我在此处找到了很好的教程http://www.learn-cocos2d.com/files/cocos2d-essential-reference-sample/Strategies_for_Accessing_Other_Nodes.html#2687105_StrategiesforAccessingOtherNodes-AccessingtheCurrentlyRunningSceneviaDirector.So
CCScene* runningScene = [CCDirector sharedDirector].runningScene;
MyScene* gameScene;

并使用(MyProgressBar *)[gameScene getChildByTag:progressBarTag];之类的东西来访问当前运行的场景节点,它仍然会有问题吗?

1 个答案:

答案 0 :(得分:0)

不,除非明确发布游戏图层,否则它将保留在内存中。如果启用了ARC,则将该属性设置为nil就足够了。这是使用这种全球游戏状态方法的严重危险,并且向初学者教授这种方法是一个可怕的想法。根据经验,不应该在不是节点本身的对象中保留节点,并且永远不保留任何父节点或兄弟节点,只保留子节点或孙子节点。这是为了避免保留周期。