我对内存管理不太擅长,所以我将以此为开始,作为我的免责声明,但我确实尝试尽可能多地了解我当前的问题。我使用Spritebuilder制作应用程序(使用cocos2d),并且每当我在两个场景之间切换时,我都会在游戏中形成缓慢的内存。我正在查看Debug Navigator下的“Memory”选项卡。使用Spritebuilder建立内存(没有检测到泄漏)
现在我在Spritebuilder中创建了一个新项目,以查看新应用程序是否也会出现此问题。它没有。所以很明显,我的具体情况正在发生。
我追踪了一下。我切换到的游戏中的一个场景只是一个带有几个CCButton的简单菜单屏幕,另一个是带有许多CCButtons,许多纹理等的较大的可滚动级别地图。显然,当我切换回更复杂的级别场景时,内存总是会增加。我在这个级别的场景中有大约60个CCButton,并决定将它们全部删除并进行相同的测试。这一次,所有CCButtons被删除,我没有看到内存建立(或者至少它是我每次切换时的1/100)。所以我认为这是建立这种记忆的主要原因 - 我为我的按钮分配记忆的方式。
我在Xcode中打开了工具工具,查找了泄漏,但没有找到任何东西(不是很擅长使用它,但看起来有点直截了当)。所以我觉得我只是分配可能没有必要的内存?
此外,我不太确定内存选项卡的确切含义。如果随着我越来越多地使用我的应用程序,这会不会造成问题?以下是我用于在级别场景中初始化按钮的方法。
-(void)createButtonAt:(CGPoint)buttonLocation buttonTitle:(NSString*)buttonTitle buttonNumber:(int)buttonNumber{
tempButton = [CCButton buttonWithTitle:buttonTitle
spriteFrame:redTile
highlightedSpriteFrame:redTile
disabledSpriteFrame:nil];
tempButton.label.color = [CCColor colorWithRed:0 green:0 blue:0];
tempButton.block = ^(id sender) {
for (int i = 1; i < buttonNumber; i++) {
[[LevelManager sharedInstance] nextLevel];
}
levelNumber = i;
[self loadMyViewController];
};
tempButton.scale = 0.3
tempButton.label.fontName = @"HelveticaNeue-Bold";
tempButton.label.fontSize = 34;
tempButton.anchorPoint = ccp(0.5, 0.5);
tempButton.position = buttonLocation;
[self addChild:tempButton];
[buttonArray addObject:tempButton];
}
当第一次加载游戏时,我会在14 MB。加载完所有的关卡和场景后,我将在60 MB左右。然后,每次我在此之后打出一个关卡时,内存都会增加6-7 MB。这是一个问题吗?请让我知道是否有这种情况发生的具体原因,或者如何解决这个问题的一些资源。谢谢!
谢谢你让我进入保留周期。我评论了这个街区,并重新审视了我的项目,然后瞧不起......内存积聚消失了。所以这似乎是罪魁祸首。不幸的是,将你的代码块复制到我的项目中并没有什么帮助。有什么我在这里失踪? – spaderdabomb
嗯...不知道从哪里拿到这里。 __weak ref为我解决了它。在我这样做之前,我曾经将每个CCControl的block属性设置为nil,放在一个方便的位置(onExit是我的情况,但只会在从其父节点中删除节点时调用)。 – YvesLeBorg