Выделение UIViewControllers в viewDidLoad.Было ли это ошибкой? - PullRequest
1 голос
/ 12 октября 2011

Мы с коллегой проектировали наш код так, чтобы наши объекты контроллера представления размещались в методе viewDidLoad наших объектов контроллера. Мы сделали это много, и граф объектов, казалось, вышел просто отлично. Через некоторое время мы обнаружили необходимость добавить еще один слой поверх нашей текущей иерархии контроллеров представлений, который бы владел, выделил и освободил наш предыдущий родительский контроллер представлений.

Это заставило меня задуматься о предупреждении о нехватке памяти, и просмотр загрузился. Раньше наши представления всегда были видны и, таким образом, не появлялись, если появлялось предупреждение о нехватке памяти, но теперь есть вероятность этого. Если это так, кажется, что когда представления перезагружаются, они будут выделять новую память для новых контроллеров представления.

Будет ли это причиной массовых утечек памяти? Или спасет нас тот факт, что мы использовали сохраненные объявленные свойства, поскольку старые контроллеры будут освобождены автоматически? Есть ли стили или соглашения, которые я должен рассмотреть? Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Если вы создаете свои контроллеры представления в viewDidLoad, вы должны освободить их в viewDidUnload. Это верно практически для любого объекта, а не только для контроллеров представления.

Но я не удивлюсь, если вы скажете "Wut !?" Если контроллеры вашего представления должны сохранять свое состояние с помощью предупреждений памяти, вы не хотите их отпускать. Но будет не лучше, если вы замените их новыми, имеющими свежее состояние.

Вероятно, нет смысла создавать контроллеры представления в viewDidLoad. Создайте их в initWithNibName: bundle: (и отпустите их в dealloc). Шаблон проектирования заключается в том, что контроллеры представлений остаются, их представления могут приходить и уходить. Если у ваших подчиненных контроллеров представления есть что-то интенсивное в памяти, освободите только этот объект в их viewDidUnload. Затем по предупреждению о памяти вы все равно освободите много памяти, но все ваши контроллеры представлений останутся в состоянии низкого использования памяти, сохранив только несколько флагов, списки индексов и т. Д., Которые им понадобятся восстановить их взгляды по запросу.

1 голос
/ 12 октября 2011

Если вы явно освобождаете каждый контроллер представления, который больше не нужен, вы не вызовете утечек памяти.Обычно, когда вы представляете контроллер представления, объект, который выполняет представление, сохраняет контроллер для вас, поэтому вы можете освободить его, если вам больше не нужен доступ к нему.Но если вы используете UINavigationController и запускаете новый контроллер представления, вам следует реализовать метод viewDidUnload.Это прямо из документации Apple:

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

Метод dealloc Метод viewDidUnload Если вы используете объявленное свойство для хранения ссылки на ваше представление, и это свойство использует сохранение семантики, присваиваядля этого достаточно нулевого значения.Свойства являются безусловно предпочтительным способом управления объектами просмотра из-за их удобства.Если вы не используете свойства, вы должны отправить сообщение о выпуске любому представлению, которое вы явно сохранили, прежде чем устанавливать соответствующее значение указателя равным nil

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...