2011-05-24 2 views
1

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

Есть одна вещь, которую я не понимаю, и она специфична для контроллеров представления UIKit, я прочитал много сообщений об этом, но я не могу найти четкий ответ.
Memory management with delegates?
Why are Objective-C delegates usually given the property assign instead of retain?
Давайте предположим, что у меня есть навигационный контроллер и я выдвигаю контроллеры просматривать через него, представьте, что видимый контроллер имеет в качестве делегата (ASSIGN не сохранять) не-видимый контроллер в стеке. Предупреждение о памяти поступает, и все контроллеры вида (кроме видимого) выгружаются с использованием метода viewDidUnload и dealloc, делегат будет выгружен и «обратный вызов» никогда не будет отправлен.
Если новый контроллер просмотра не нажат, но представленный «соединение» между делегатом и контроллером представления никогда не будет потерян, viewDidUnload никогда не вызывается в родительском представлении.

У меня есть вопрос:
Правильно ли использовать шаблон делегирования между двумя диспетчерами?

ответ

2

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

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

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

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

В самом деле, это то, что Apple Docs говорят:

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

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

+0

я вижу ... и understood..finally немного света ;-) это просто принадлежит вид VC, который не удаляется сам ВК. Огромное спасибо!!!!! – Andrea

0

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

+0

Спасибо вам тоже Морган два голоса лучше, чем один :-) – Andrea

Смежные вопросы