Шаблоны делегирования и контроллеры представления UIKit, как насчет -viewDidUnload? - PullRequest
1 голос
/ 24 мая 2011

Я довольно новичок в программировании, и я начал изучать ObjC и CocoaTouch Framework.Я узнал о шаблоне делегирования, и мне довольно удобно его использовать, но, может быть, я использую его слишком много.

Есть одна вещь, которую я не понимаю, и она специфична для контроллеров представления UIKit, яЯ прочитал много сообщений об этом, но я не могу найти четкий ответ.
Управление памятью с делегатами?
Почему делегатам Objective-C обычно даютприсвоить свойство вместо сохранения?
Давайте предположим, что у меня есть контроллер навигации, и я проталкиваю через него контроллеры представления, представьте, что видимый контроллер имеет в качестве делегата (назначить не сохранять) невидимый контроллер встек.В память поступает предупреждение, и все контроллеры представления (кроме видимого) выгружаются с использованием методов viewDidUnload и dealloc, делегат будет выгружен, и «обратный вызов» никогда не будет отправлен.
Если новый контроллер представления не выдвинут, ноПри модальном представлении «соединение» между делегатом и контроллером представления никогда не теряется, viewDidUnload никогда не вызывается в родительском представлении.

Вот мой вопрос:
Правильно ли использовать шаблон делегирования между двумя контроллерами представления

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Это, безусловно, правильный дизайн, в зависимости от семантики ваших контроллеров.Я использовал это, когда «ведущий» контроллер представления управлял (и принимал вызовы делегатов) от «ведомых» контроллеров представления.

Что касается вашего анализа того, что происходит в случае отправки предупреждения памяти, возможно, существуетнебольшое недоразумение в том, что контроллер представления фактически получает viewDidUnload, но это означает, что управляемый им view был выгружен для возврата некоторой памяти, поэтому контроллер может выполнять свою часть очистки (как обычно),Контроллер представления сам по себе не «выгружен» или освобожден, или что-то еще.Таким образом, обратный вызов всегда будет отправлен.Единственное, что, если представление ранее было выгружено, вам необходимо восстановить его.

Помните также, что, если для вас совершенно невозможно воссоздать ваши незагруженные представления, вы можете запретить конкретное представление.из-за освобождения без вызова super в вашем didReceiveMemoryWarning переопределении.Примите это предложение "cum granum salis", однако!

В конце концов, нет необходимости использовать модальное представление.

Действительно, это то, что Apple Docs говорит:

  • (void) didReceiveMemoryWarning: реализация по умолчанию этого метода проверяет, может ли контроллер представления безопасно освободить свое представление.Это возможно, если само представление не имеет суперпредставления и может быть перезагружено либо из файла пера, либо с помощью пользовательского метода loadView.Если представление может быть освобождено, этот метод освобождает его и вызывает метод viewDidUnload.

  • (void) viewDidUnload: этот метод вызывается как аналог метода viewDidLoad.Он вызывается в условиях нехватки памяти, когда контроллеру представления необходимо освободить свое представление и любые объекты, связанные с этим представлением, чтобы освободить память.Поскольку контроллеры представлений часто хранят ссылки на представления и другие связанные с представлением объекты, вы должны использовать этот метод, чтобы отказаться от владения этими объектами, чтобы можно было восстановить память для них.Вы должны делать это только для объектов, которые вы можете легко восстановить позже, либо в вашем методе viewDidLoad, либо из других частей вашего приложения.Вы не должны использовать этот метод для публикации пользовательских данных или любой другой информации, которая не может быть легко воссоздана.

0 голосов
/ 24 мая 2011

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

...