получить "EXC_BAD_ACCESS" при попытке dismissModalViewController после того, как родительский контроллер представления был viewDidUnload - PullRequest
0 голосов
/ 13 июня 2011

У меня есть контроллер представления с именем «MainView», он будет вызывать

[self presentModalViewController:playView animated:NO];

для вставки контроллера представления «PlayView».

Когда приложение работает в PlayView, если получаетapplicationDidReceiveMemoryWarning сообщение, оно вызовет функцию viewDidUnload MainView и освободит объект MainView.В этот момент PlayView все еще жив.Все в порядке, пока пользователь не нажмет кнопку, чтобы выйти из PlayView, он (PlayView) будет вызывать:

[self dismissModalViewControllerAnimated:NO];

Затем приложение завершает работу, получая сообщение об ошибке EXC_BAD_ACCESS ... Я думаю, причинаэтот объект MainView исчез, когда PlayView хочет закрыть себя, он не может найти подходящий ViewController для представления.

Как решить эту проблему?T_T

PS.контроллер представления PlayView создается IB, и он устанавливается как свойство сохранения в MainView.

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Полагаю, проблема в вашем MainView . У него есть некоторые выходы или свойства, которые указывают на представления (которые лежат на главном представлении). После того, как предупреждение о памяти MainView.view выгружено (поэтому оно освобождает свои подпредставления), и если вы не сохранили их и не установили их в ноль, они теперь указывают на объекты, существующие в заметках. Поэтому вы должны установить их все в ноль в методе viewDidUnload.

0 голосов
/ 17 июня 2011

Кажется, я нахожу проблему.У меня есть контроллер представления с именем "VCGameRule", под MainView.И он имеет объявление в файле VCGameRule.h следующим образом:

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

В VCGameRule.m в функции инициализации есть следующий код:

lblInitialCash = [[UILabel alloc] initWithFrame:CGRectMake(135, 12, 50, 20)];

И егоФункция viewDidUnload выглядит следующим образом:

- (void)viewDidUnload {
   [super viewDidUnload];
   // Release any retained subviews of the main view.
   self.lblInitialCash = nil; 
}

Видите проблему?Я пытаюсь назначить новый выделенный объект UILabel для lblInitialCash, который является сохраненным свойством IBOutlet.И я пытаюсь освободить свойство в функции viewDidUnload, затем происходит что-то плохое ...

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

После того, как я изменил свойство IBOutlet на обычные переменные класса, ошибка, похоже, больше не возникает!И теперь все хорошо, даже мое приложение действительно использует много памяти и много раз выполняет функцию viewDidUnload, приложение все еще живо.\ (^ О ^) /

...