2015-06-07 3 views
0

Я не очень хорошо разбираюсь в управлении памятью, поэтому я начну с этого как отказ от ответственности, но я попытался выяснить насколько смогу о моей текущей проблеме , Я использую Spritebuilder для создания приложения (использует cocos2d), и всякий раз, когда я переключаюсь между двумя сценами, я получаю медленную память в моей игре. Я смотрю вкладку «Память» в «Навигаторе отладки».Накопление памяти (обнаружено не обнаружено утечек) с помощью Spritebuilder

Теперь я создал новый проект в Spritebuilder, чтобы узнать, есть ли у этого приложения новое решение. Это не так. Так ясно, что в моей жизни что-то происходит.

Я отследил его немного дальше. Одна из сцен в моей игре, к которой я перехожу, - это просто простой экран меню с паролем CCButtons, а другой - более прокручиваемая карта уровня с множеством CCButtons, множеством текстур ... и т. Д. Очевидно, что память всегда создавалась, когда я переключился на более сложную сцену уровня. У меня около 60 CCButtons на этом уровне сцены, и решил удалить их все и выполнить один и тот же тест. На этот раз, когда все 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 МБ. После загрузки всех моих уровней и сцен я бы составил около 60 МБ. Затем каждый раз, когда я играл на этом уровне, память увеличивалась бы на 6-7 МБ. Это проблема? Пожалуйста, дайте мне знать, если есть конкретная причина, по которой это происходит, или какие-то ресурсы для устранения этого. Благодаря!

ответ

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 в нуле в удобном месте (onExit в моем случае, но будет вызываться только тогда, когда узел будет удален из его родителя). – YvesLeBorg