Перенесенный проект ios arc Очистка памяти после presentViewController

Используя Инструмент, после перехода на ARC я понимаю, что переход с экранов не очищает память. пример шагов:

1)Главный экран A -> игровой экран B = увеличение использования памяти 2)Игра завершена, и я перехожу с экрана B обратно на главный экран A

На шаге 2 использование памяти не снижается. Я хотел бы, чтобы память, потребляемая экраном B, освобождалась при удалении экрана B с экрана ... Что мне делать, чтобы это освобождение произошло?

Переход от А к Б:

GameVC_iPad *game = [[GameVC_iPad alloc]initWithNibName:@"ClassicGameVC_iPad" bundle:nil]; [self presentViewController: анимированная игра: ДА, завершение: ноль];

Возврат к A из B выполняется с помощью этого кода:

HomeVC_iPad *home = [[HomeVC_iPad alloc]initWithNibName:@"HomeVC_iPad" bundle:nil]; home.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; [самостоятельный PresentViewController: домашний анимированный: ДА завершение: ноль];

Любая подсказка?


comment
Вы на самом деле не возвращаетесь, а вместо этого просто представляете другой контроллер представления поверх существующего...   -  person JustSid    schedule 17.06.2012


Ответы (3)


Когда вы вернетесь к А, вы должны сделать

[self dismissModalViewControllerAnimated:YES];

В настоящее время вы создаете новый контроллер представления, который неверен, и переходите к нему в другой раз, так что это то, что происходит

A представляет B, который затем представляет новый A, который затем представляет новый B и так далее...

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

person Omar Abdelhafith    schedule 17.06.2012

Не создавайте новую копию вашего домашнего контроллера. Используйте dismissViewControllerAnimated:completion:, чтобы вернуться к существующему.

person Phillip Mills    schedule 17.06.2012

Если вы создаете класс делегата для b, например, вы назвали его BDelegate и заставили ViewController для A соответствовать этому протоколу, то вы можете легко передать сообщение обратно в A, что вы хотите, чтобы B был удален. Так, например, вы можете создать:

Делегат :

@protocol BDelegate <NSObject>

- (void)dismissViewB;

@end

Затем измените контроллер представления для A (файл заголовка) на:

@interface AViewController : UIViewController <BDelegate>

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

- (void)dismissViewB {
    [self dismissViewControllerAnimated:YES completion:NULL];
}

Почти готово! Теперь в вашем контроллере представления B, где бы вы ни хотели удалить представление, поэтому я предполагаю, где у вас сейчас есть

HomeVC_iPad *home = [[HomeVC_iPad alloc]initWithNibName:@"HomeVC_iPad" bundle:nil];
home.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentViewController:home animated:YES completion:nil];

Замените это на

[delegate dismissViewB];

Теперь все, что вам нужно внутри контроллера представления B, — это переменная экземпляра, указывающая на делегата A и для его назначения. Итак, в заголовок контроллера B добавьте что-то вроде

NSObject<BDelegate> *delegate;

И добавьте для него соответствующее @property и @синтезируйте его в теле. Затем, когда вы создаете контроллер представления B, как в своем первом сообщении, просто добавьте

game.delegate = self

Затем, если все прошло хорошо, когда вы нажмете кнопку или сделаете все, что вам нужно сделать, чтобы удалить представление, контроллер представления A закроет его для вас :)

Надеюсь это поможет

person PaReeOhNos    schedule 26.06.2012