didReceiveMemoryWarning не вызывается в некоторых контроллерах представления в стеке контроллера представления UINavigationController

Я сделал UINavigationViewController с контроллером представления A в качестве корневого контроллера представления, а затем нажал на контроллер представления B. Когда я имитирую предупреждение о памяти в симуляторе, вызывается только didReceiveMemoryWarning A. Конечно, я переопределил didReceiveMemoryWarning как в A, так и в B. В конце концов я решил проблему, вызвав метод B didReceiveMemoryWarning внутри класса A didReceiveMemoryWarning. Однако я не знаю, почему метод B вызывается автоматически. ViewDidUnload A и viewDidUnload B вызываются должным образом, поскольку я вызываю предупреждение при представлении контроллера модального представления из B.

Если контроллер представления B является корнем контроллера навигации, то didReceiveMemoryWarning вызывается без проблем.


person minorblend    schedule 26.08.2012    source источник


Ответы (1)


Я видел наиболее частые причины этого:

  • Вы вызываете [[NSNotificationCenter defaultCenter] removeObserver:self] в одном из контроллеров представления. Вы не должны этого делать, потому что UIViewController регистрируется для получения уведомлений о подобных вещах.

  • Вы делаете что-то странное с иерархией контроллера представления, например добавляете представление другого контроллера представления в качестве подпредставления без использования методов сдерживания iOS 5 или обычных методов представления контроллера представления (presentViewController: и другие).

person Jesse Rusak    schedule 26.08.2012
comment
Согласованный. Если вы делаете pushViewController, у вас не должно быть этой проблемы. Но слишком много разработчиков делают _2 _... - person Rob; 26.08.2012
comment
спасибо за ваше предложение. Однако ни один из них не решает мою проблему. :( Я удалил все вызовы removeObserver: self и уже использую pushViewController для представления контроллера представления B из A. - person minorblend; 27.08.2012
comment
Вы говорите, что ViewDidUnload B. вызывается правильно. Включает ли трассировка стека для этого вызова уведомление о предупреждении памяти? Я думаю, что обычно так и есть. Возможно, это даст вам некоторое представление о том, действительно ли ваш контроллер представления получает это уведомление. (Не могли бы вы сделать опечатку в didReceiveMemoryWarning?) - person Jesse Rusak; 27.08.2012
comment
@JesseRusak спасибо за советы. =) Тем не менее, я новичок в платформе iOS и среде Xcode. Я постараюсь разобраться в том, что вы предложили, и добавить комментарии по этому поводу. - person minorblend; 28.08.2012