ios5: остановка представлений от выгрузки / остановка вызова viewDidUnload

Учитывая, что iOS6 больше не выгружает представления, и, следовательно, больше не вызывает UIViewController"s viewDidUnloadМне было интересно, есть ли надежный способ вызвать такое же поведение на iOS5?

То есть я бы очень хотел остановить загрузку своих представлений на iOS5 по тем же причинам, по которым Apple объясняет, почему они больше не выгружают представления на iOS 6 (потому что она больше не экономит сколько-нибудь значительный объем памяти и почти всегда источник дополнительных ошибок). Я бы скорее потратил свое время на разработку полезных функций, чем на тестирование множества случаев, которые теперь могут происходить только на iOS5 и только в нехватке памяти!

Я искал вокруг и не могу найти никого, кто задавал этот вопрос раньше, что удивляет меня. Может ли это быть так же просто, как сохранить дополнительную ссылку на self.view в viewDidLoad (и выпуская это только в dealloc)? Есть ли вероятные ловушки?

2 ответа

Решение

На iOS5 не поддерживается остановка выгрузки представлений, что также может привести к огромной проблеме с памятью, поскольку способ обработки представлений iOS6 совершенно другой. В iOS6 резервное хранилище видов по-прежнему удаляется из памяти, если необходимо, или, по крайней мере, оно помечено для возможности удаления из памяти. Насколько мне известно, на iOS5 это не так. Резервное хранилище удаляется только в том случае, если само представление удаляется, даже если само представление имеет размер всего пару байтов.

Посмотрите на этот замечательный пост: View Controller Lifecycle в iOS 6 Это может дать вам представление о том, насколько сложным является то, о чем вы просите.

Основное отличие теперь состоит в том, что представления не выгружаются автоматически в didReceiveMemoryWarning, а также viewDidUnload не называется.

Это не означает, что вы не должны выгружать свои просмотры - фактически, в видео WWDC они предлагают сделать это в didReceiveMemoryWarning, Главное отличие сейчас в том, что вы абсолютно контролируете, что происходит и когда. Многие люди полагались на код в viewDidUnload который часто так или иначе не вызывался, как ожидалось - например, просто удаляя представление и выпуская контроллер.

Если вы не хотите освобождать свой вид предупреждений в памяти (что, опять же, может или не может быть тем, что вы хотите), вы можете просто не устанавливать для свойства представления значение nil. Если у вас есть пустой didReceiveMemoryWarning в вашем контроллере, это будет работать и в iOS 5 (без вызова super).

Я серьезно советую относиться к этим предупреждениям серьезно. Они - ваша единственная цель, чтобы очистить, возможно, неиспользуемую память, и резервные хранилища просмотров могут стать действительно большими.

Изменить: Вы должны рассмотреть возможность не выгружать свои представления, если их мало, они часто используются и занимают мало памяти.

Другие вопросы по тегам