2013-02-12 6 views
0

У меня проблема, которая действительно делает мою голову вXcode Instruments - не может найти утечку

Так в основном у меня есть MainMenuScene, который в свою очередь создает тестовый слой.. Этот слой очень прост, так как он создает только метку оценки и кнопку, которая добавляется в меню. При нажатии этой кнопки MainMenuScene заменяется пустой сценой, а затем снова загружается MainMenuScene.

Пока все хорошо. Однако проблема заключается в том, когда я беру кучу в инструментах каждый раз, когда сцена перезагружается, я получаю увеличение кучи около 20 КБ. Когда я копаю глубже в расширенном представлении, кажется, что спрайт и шрифт из тестового слоя не освобождаются, и все же вызывается метод dealloc со слоя.

Я также добавляю поддержку ARC для своих файлов, кроме основных файлов Cocos. Может ли это быть связано каким-либо образом?

Вот тестовый слой:

@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

Что подсказывает ваша оптимизация? Вы получаете катастрофу памяти? Разница в куче 20K для меня не очень похожа. Это просто предварительная зрелая оптимизация? Я могу понять, что это беспокоит вас, что память растет. Это тоже меня беспокоит, но это проблема? –

+0

@Matt Длительный размер всего 20 КБ, потому что это небольшой тестовый слой. Если я использую оригинальный слой, утечка около 400 кб :( –

ответ

0

Да, я сделал то же испытание на unARCed в проекте с правильными вызовами [супер dealloc] и т.д., и получил точно такое же поведение.

Однако, после более тщательного осмотра, я все еще не уверен, что у меня есть утечки или я не интерпретирую результаты правильно.

Итак, у меня есть программа в исходном состоянии и сделайте снимок. Затем я нажимаю кнопку ui, которая заменяет сцену, а затем перезагружается. Я возвращаюсь в исходное состояние и беру еще один кучу и замечаю, что куча имела рост около 20 кБ или около того. Когда я снова нажимаю кнопку ui, предыдущий heapshot возвращается к нулевым байтам. Сделав это несколько раз, предыдущий heapshot всегда возвращается к нулевым байтам.

Потому что в cocos2d каждый раз, когда вы заменяете сцену, все прикрепленные к этой сцене освобождаются, и когда вы возвращаетесь к ней, все снова выделяется. Поэтому я думаю, что всегда будет рост кучи, потому что этот рост - это размер сцены с этим слоем в детстве. Имеет ли это смысл?

Также я заметил, что каждый раз, когда я это делал, столбец #Living в статистике не увеличивался, что является хорошим знаком, верно?

Смежные вопросы