我遇到的问题确实在我的脑海中。
所以基本上我有一个MainMenuScene,它反过来创建一个测试层。这个图层非常简单,因为它只创建一个分数标签和一个添加到菜单的按钮。 按下此按钮时,MainMenuScene将替换为空白场景,然后再次加载MainMenuScene。
到目前为止一切顺利。然而问题是当我每次重新加载场景时在乐器中拍摄快照时,我的堆增加了大约20kb。当我在扩展视图中深入挖掘时,似乎来自testLayer的精灵和字体没有被释放,但是正在调用层中的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
我真的看不出这有什么问题。
由于
答案 0 :(得分:0)
是的,我对unARCed项目进行了相同的测试,对[super dealloc]等进行了所有正确的调用,并得到了完全相同的行为。
然而,仔细检查后,我仍然不确定是否有泄漏或我没有正确解释结果。
所以我让程序处于初始状态并拍摄快照。然后我按下ui按钮,使场景被替换,然后重新加载。我回到初始状态并再次获取快照并注意到堆的增长大约为20kb左右。当我再次按下ui按钮时,之前的快照将返回零字节。在这样做了几次之后,之前的快照总是回到零字节。
因为在cocos2d每次更换场景时,所有附加到该场景的内容都会被释放,当你回到它时,所有内容都会再次分配。所以我认为总会有一个堆增长,因为增长是场景的大小,该层作为孩子。这有意义吗?
另外我注意到每次我这样做时,统计中的#Living列都没有增加,这是一个好兆头,对吗?