0

我遇到了一个真正让我头疼的问题。

所以基本上我有一个 MainMenuScene,它反过来创建了一个测试层。该层非常简单,因为它只创建一个乐谱标签和一个添加到菜单的按钮。当按下此按钮时,MainMenuScene 将被空白场景替换,然后再次加载 MainMenuScene。

到目前为止,一切都很好。然而问题是,当我每次重新加载场景时在仪器中进行堆放时,堆增加了大约 20kb。当我在扩展视图中深入挖掘时,似乎 testLayer 中的 sprite 和字体没有被释放,但是 layer 中的 dealloc 方法正在被调用。

除了核心 Cocos 文件之外,我还为我的文件添加了 ARC 支持。这有什么关系吗?

这是测试层:

@implementation TestLayer

-(id)init
{
    self = [super initWithColor:ccc4(2,2,2,210)];
    if (self != nil)
    {
        // ask director the the window size
    CGSize s = [[CCDirector sharedDirector] winSize];

        self.isTouchEnabled = YES;

        NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        formatter.numberStyle = NSNumberFormatterDecimalStyle;

        NSNumber * n = [NSNumber numberWithInt:[SDCloudUserDefaults integerForKey:@"highscore"]];

        NSString *string = [formatter stringFromNumber:n];

        //score
        CCLabelBMFont * scoreLabel = [CCLabelBMFont labelWithString:string fntFile:@"scoreFont.fnt" width:s.width alignment:kCCTextAlignmentCenter];
        scoreLabel.position =  ccp( POS_X(443), POS_Y(877) );
        [self addChild:scoreLabel z:90];

        //PLAY BUTTON
       CCMenuItemSprite *playButton = [CCMenuItemSprite itemFromNormalSprite:[CCSprite spriteWithFile:@"play_up.png"]
                                                               selectedSprite:[CCSprite spriteWithFile:@"play_down.png"]
                                                                       target:self
                                                                     selector:@selector(Transition:)];

        playButton.position = ccp( POS_X(380) , POS_Y(177));

        menu = [CCMenu menuWithItems: playButton, nil];
        menu.position = ccp(0, 0);
        [self addChild: menu];

       }
    return self;
}

-(void) Transition:(ccTime) dt
{
    [self unschedule:@selector(Transition:)];
    [[SceneManager sharedSceneManager]RunSceneWithID:SCENE_LOADING:eCCTransitionCrossFade:1.0f];

}

- (void) dealloc
{
    NSLog(@"%s",__FUNCTION__);
}
@end

我真的看不出这有什么问题。

谢谢

4

1 回答 1

0

对,我在一个 unARCed 项目上做了同样的测试,对 [super dealloc] 等的所有正确调用都正确,并且得到了完全相同的行为。

然而,经过仔细检查,我仍然不确定我是否有泄漏或者我没有正确解释结果。

因此,我将程序置于初始状态并进行了快照。然后我按下 ui 按钮,使场景被替换然后重新加载。我回到初始状态并拍摄另一个堆,并注意到堆增长了大约 20kb 左右。当我再次按下 ui 按钮时,前一个 heapshot 回到零字节。这样做几次后,前一个堆总是回到零字节。

因为在 cocos2d 中,每次替换场景时,附加到该场景的所有内容都会被释放,当您回到它时,所有内容都会重新分配。所以我认为总会有一个堆增长,因为增长是场景的大小,该层作为一个孩子。这有意义吗?

我还注意到,每次我这样做时,统计数据中的#Living 列都没有增加,这是一个好兆头,对吧?

于 2013-02-13T15:57:25.213 回答