Проблемы утечки памяти UIViewController

У вас есть 2 функции main() и game_over(), каждая из которых имеет свой собственный цикл обработки событий и выполняет собственный рисунок.
Создайте 2 переменные состояния. Первое состояние (run) указывает на необходимость продолжения или прекращения игры.
Второе состояние gameover указывает, находится ли игра в состоянии «игра окончена» или «игра запущена».
В зависимости от состояния gameover, либо main(), либо game_over() должны вызываться непрерывно в главном цикле. Обе функции могут изменять состояния и должны возвращать текущие значения переменных состояния. Если gameover изменяется с True на False, переменные управления игрой должны быть установлены в их начальное состояние (конечно, вы можете написать функцию для этого и в своем коде): 110]

Функция завершения игры должна рисовать экран «окончена игра» и, конечно, pygame.display.update(). Функция оценивает изменения состояния и возвращает значения:

def game_over():

    screen.fill(LIGHTBLUE)
    draw_text("GAME OVER", 48, WHITE, screen_width/2, screen_height/4)
    draw_text("Score: " + str(score), 22, WHITE,  screen_width / 2, screen_height / 3)
    draw_text("Press SPACE to play again or ESC to exit", 22, WHITE, screen_width/2, screen_height / 4)
    pygame.display.update()
    fps_controller.tick(25)

    rungame = True 
    continuegame = False 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rungame  = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                continuegame = True
            if event.key == pygame.K_ESCAPE:
                rungame = False
    return rungame, not continuegame

Если змея сталкивается, то main возвращает измененное состояние:

def main():
    global update, direction, snake_pos, snake_speed, apple_spawn, apple_pos
    pygame.time.delay(60)

    rungame = True
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rungame = False

    # [...]

    collision = False
    if snake_pos[0] < 0 or snake_pos[0] > screen_width-20:
        collision = True
    if snake_pos[1] < 0 or snake_pos[1] > screen_height-20:
        collision = True

    for block in snake_body[1:]:
        if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
            collision = True

    score(scoreval)
    pygame.display.update()
    fps_controller.tick(25)

    return rungame, collision
9
задан Ari Braginsky 3 March 2009 в 23:08
поделиться

4 ответа

Вы загружаете второй контроллер представления из NIB? Если так, Вы захотите проверить, что Вы освобождаете связанную память правильно.

Вот то, на что типичный основанный на NIB контроллер представления похож в моих проектах.

SomeViewController.h

@interface SomeViewController : UIViewController {
    UILabel *someLabel;
}

@property (nonatomic, retain) IBOutlet UILabel *someLabel;

@end

SomeViewController.m

@implementation SomeViewController

@synthesize someLabel;

- (void)dealloc {
    // Release our retained IBOutlets
    self.someLabel = nil;
    [super dealloc];
}

@end
4
ответ дан 4 December 2019 в 23:41
поделиться

Один способ уменьшить Ваше использование памяти состоял бы в том, чтобы изменить размер изображения к любому размеру, который Вы хотите (если, конечно, Вы не хотите 320x480 изображение). Это помогло много в моем случае.

Второй viewcontroller Вы говорите об изменении? В противном случае затем было бы лучше сделать это одиночным элементом и использовать тот же экземпляр. Вы можете любое время изменять значения, используемые viewcontroller. Эта статья объясняет, как можно создать одноэлементные объекты (с кодом)

Другая статья здесь показывает использование singleton-класса (хотя отличающийся от Вашего варианта использования, это разъяснит, как использовать одиночные элементы),

Я предложил бы создать одноэлементный объект для UIImagePickerController также.

1
ответ дан 4 December 2019 в 23:41
поделиться

У Вас есть какие-либо циклы в Вашей цепочке владения? Что-то как:

@interface FirstViewController: UIViewController {
  SecondViewController *secondViewController;
}
@end

@interface SecondViewController: UIViewController {
  FirstViewController *firstViewController;
}
@end

Если Вы явно не повредите этот цикл при отбрасывании этих контроллеров представления то они протекут.

Кроме того, я полагаю, что Вы ответственны за выпуск всех объектов верхнего уровня, которые загружаются из файла пера, когда Вам больше не нужны они.

1
ответ дан 4 December 2019 в 23:41
поделиться

Возможно, вы могли бы сохранить изображение перед переходом в информационное окно. После сохранения отпустите изображение и перейдите в информационное окно. Если пользователь вернется, загрузите изображение из папки.

0
ответ дан 4 December 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: