2015-06-07 20 views
0

我对内存管理不太擅长,所以我将以此为开始,作为我的免责声明,但我确实尝试尽可能多地了解我当前的问题。我使用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。这是一个问题吗?请让我知道是否有这种情况发生的具体原因,或者如何解决这个问题的一些资源。谢谢!

回答

1

如果我记得,我认为问题是与setBlock这会导致保留周期。试试这个:

__weak id _weakSelf = self; 
tempButton.block = ^(id sender) { 
    for (int i = 1; i < buttonNumber; i++) { 
     [[LevelManager sharedInstance] nextLevel]; 
    } 
    levelNumber = i; 
    [_weakSelf loadMyViewController]; 
}; 

obcit:从内存,未测试,但应该工作。

+0

谢谢你让我进入保留周期。我评论了这个街区,并重新审视了我的项目,然后瞧不起......内存积聚消失了。所以这似乎是罪魁祸首。不幸的是,将你的代码块复制到我的项目中并没有什么帮助。有什么我在这里失踪? – spaderdabomb

+0

嗯...不知道从哪里拿到这里。 __weak ref为我解决了它。在我这样做之前,我曾经将每个CCControl的block属性设置为nil,放在一个方便的位置(onExit是我的情况,但只会在从其父节点中删除节点时调用)。 – YvesLeBorg