我在互联网上发现了多级应用程序的样本,(比如选择级别时切断绳索)
有共享实例对象,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];
此链接,并在游戏数据中使用
CCScene* runningScene = [CCDirector sharedDirector].runningScene;
MyScene* gameScene;
并使用(MyProgressBar *)[gameScene getChildByTag:progressBarTag];
之类的东西来访问当前运行的场景节点,它仍然会有问题吗?
答案 0 :(得分:0)
不,除非明确发布游戏图层,否则它将保留在内存中。如果启用了ARC,则将该属性设置为nil就足够了。这是使用这种全球游戏状态方法的严重危险,并且向初学者教授这种方法是一个可怕的想法。根据经验,不应该在不是节点本身的对象中保留节点,并且永远不保留任何父节点或兄弟节点,只保留子节点或孙子节点。这是为了避免保留周期。