iOS - viewDidUnload не вызывается, но вызывается didReceiveMemoryWarning

Попытка найти причину сбоя на определенных устройствах. Я заметил, что мои контроллеры представления получают didReceiveMemoryWarning, но НЕ viewDidUnload. И согласно Apple:

вы не должны использовать didReceiveMemoryWarning для освобождения ссылок на объекты представления, вы можете использовать его для освобождения любых структур данных, связанных с представлением, которые вы еще не освободили в своем методе viewDidUnload. (Сами объекты представления всегда должны освобождаться в методе viewDidUnload.)

So,

A: Почему viewDidUnload не вызывается? Я не могу удалить свои объекты просмотра здесь, если они никогда не вызываются.

B: Если я не должен удалять свои объекты представления в didReceiveMemoryWarning, где еще я могу это сделать?

C: При использовании ARC мне по-прежнему нужно удалять объекты представления, устанавливать массивы на ноль и т. д.?


person soleil    schedule 09.10.2012    source источник
comment
Я считаю маловероятным, что ваш сбой вызван тем, что вы не удалили просмотры и тому подобное. Вы должны проверить с помощью инструментов, что нехватка памяти вызывает сбои.   -  person MaxGabriel    schedule 09.10.2012
comment
@MaxGabriel У меня заканчивается память. Но у одного из моих контроллеров представлений много изображений. Поэтому, когда я получаю предупреждение, я могу освободить память, удалив их.   -  person soleil    schedule 09.10.2012


Ответы (3)


Как упоминалось выше, viewDidUnload: устарело в iOS 6. Но в качестве дополнительной информации вы должны знать, что редко требуется выгружать UIView, так как iOS 6 делает свое волшебство в фоновом режиме - уничтожает растровый слой подложки CALayer вида (который, безусловно, является самой большой «частью» UIView). Если представление понадобится снова, iOS вызовет drawRect:, где вы создадите свое представление, и все будет в порядке.

Для получения дополнительной информации прочитайте эту замечательную статью Джо Конвея: Жизненный цикл ViewController в iOS 6

person Pfitz    schedule 10.10.2012

viewDidUnload устарело в iOS6. Вы «можете» удалить представления в didReceiveMemoryWarning, если считаете это необходимым, но это остается на ваше усмотрение.

Эта ветка тоже может помочь.

viewDidUnload больше не вызывается в ios6

person barley    schedule 09.10.2012
comment
святое дерьмо, я не знал этого. Разве это не делает любое приложение, которое очищало представления в viewDidUnload, очень восприимчивым к сбою при получении предупреждений о памяти? - person soleil; 09.10.2012
comment
И если представление не выгружается, как контроллер представления узнает, что представление необходимо перезагрузить? Я могу удалить представления изображений в didReceiveMemoryWarning, но теперь они исчезают, когда я возвращаюсь к этому контроллеру представления. - person soleil; 09.10.2012
comment
Я не на сто процентов, но я понимаю, что если вы установите self.view = nil, при следующем доступе к представлению будет вызываться viewDidLoad. Кстати, если вы создаете свои подпредставления как IBOutlet, наилучшая практика, по-видимому, объявляет их как свойства weak, так что, когда вы устанавливаете self.view = nil, все подпредставления также будут выпущены. - person barley; 09.10.2012

didReceiveMemoryWarning специально нацелен не на выгрузку представления, а на то, чтобы контроллер представления выпускал объекты, которые можно легко воссоздать (например, UIIamges и тому подобное). Вы не должны освобождать объекты в своем представлении, если они не могут быть легко воссозданы по мере необходимости.

person zachjs    schedule 09.10.2012