2012-06-29 2 views
63

В чем разница между viewDidLoad и viewDidAppear? Какая инициализация или пользовательский код входят в эти функции?Разница между viewDidLoad и viewDidAppear

например. presentModalViewController работает только в том случае, если присутствует в viewDidAppear, а не на viewDidLoad.

+0

См [UIViewController. viewDidLoad и viewWillAppear: каково надлежащее разделение труда?] (http://stackoverflow.com/questions/1579550/uiviewcontroller-viewdidload-vs-viewwillappear-what-is-the-proper-division-of) –

ответ

118

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

viewDidAppear вызывается, когда представление фактически видимо и может быть вызвано несколько раз в течение жизненного цикла контроллера просмотра (например, когда диспетчер Modal View отклонен, и представление становится видимым снова). Здесь вы хотите выполнить любые действия макета или сделать какой-либо чертеж в пользовательском интерфейсе - например, представив контроллер модального представления. Однако все, что вы здесь делаете, должно повторяться. Лучше не хранить здесь вещи, иначе вы получите утечку памяти, если вы не отпустите их, когда представление исчезнет.

См: https://developer.apple.com/documentation/uikit/uiviewcontroller

+11

Вы и WrightsCS абсолютно правы. Но, чтобы не разделить волосы, но в то время как 'viewDidLoad' обычно вызывается только один раз и только один раз, есть одна ситуация, когда он может быть вызван снова. В частности, если вы когда-либо получили 'didReceiveMemoryWarning', ваши невидимые виды могут быть выпущены (хотя контроллеры представления нетронуты), и когда вы вернетесь назад,' viewDidLoad' может быть вызван для них снова. – Rob

+0

Это правда, но в любом случае любые сохраненные ivars будут выпущены, поэтому их можно повторно инициализировать ... но если вы сохраните ivar в viewDidAppear и не отпустите его в viewDidDisappear, вы, скорее всего, получите память если вы нажимаете другие контроллеры представлений поверх текущего. – davidgoli

+1

Я не уверен, согласен ли я с комментарием о контроллере просмотра ivars всегда и автоматически освобождаюсь для вас (сам контроллер не освобожден). Я подозреваю, что мы оба можем легко построить viewDidLoad, который будет протекать, если он был повторно вызван после 'didReceiveMemoryWarning'. Но я согласен с тем, что если вы используете хорошие методы при написании своего 'viewDidLoad', вы должны быть в порядке. Мое единственное замечание заключается в том, что небрежное использование иваров и ручное управление памятью может привести к утечкам в 'viewDidLoad'. Люди должны быть чувствительны к сценарию 'didReceiveMemoryWarning' и соответствующим образом программировать. – Rob

18

Проще говоря, вы хотели бы создать любые элементы управления или массивы в viewDidLoad, где, как и в viewDidAppear, вы хотели бы обновить эти элементы управления или массивы.

viewDidLoad вызывается один раз, когда создается контроллер и viewDidAppear называется каждый раз, когда вид, ну, не появилась. Итак, скажите, что у вас есть модальный вид, который вы представляете, когда этот взгляд отклоняется, будет называться viewDidAppear, и не вызывается.

+3

Первый абзац это хорошо нарисованный отзыв. Но второй абзац неверен. 'viewDidLoad' может быть * вызван более одного раза *. Если ваше представление, пока оно не отображается (под стеком других представлений), выгружается более старыми версиями iOS в ситуации с низкой памятью, тогда контроллер просмотра автоматически перезагружает представление при необходимости повторного отображения на экране. В более поздних версиях iOS вы можете помочь уменьшить использование памяти, выполнив то, что ранее сделала iOS для вас: выгрузите экранные представления, когда поступило сообщение 'didReceiveMemoryWarning', и в этом случае' viewDidLoad' будет вызываться снова. –

+0

@WrightsCS у вас есть официальный яблочный документ, который говорит это? «viewDidLoad вызывается один раз при создании контроллера» Поскольку я помню, в прошлом viewDidLoad можно было вызывать несколько раз под сценариями с низкой памятью. Большое спасибо. – Ricardo

+0

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLoad – WrightsCS

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