Для viewcontroller initWithNibName и dealloc всегда вызываются в паре - PullRequest
0 голосов
/ 30 января 2012

Если вызывается dealloc для viewcontroller, то в следующий раз, когда viewcontroller будет "вызван", будет снова вызван initWithNibName?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

методы init вызываются программным обеспечением, которое вы пишете, или косвенно вызывается через вызовы [super init ...] (который также инициируется вашим программным обеспечением).

Если на вашем контроллере вида вызывается метод dealloc, то это потому, что он был освобожден до нуля.

Мне интересно, если вас больше интересует выгрузка и загрузка видов. (ОБНОВЛЕНИЕ) Если это так, посмотрите на эту тему . Он объясняет некоторые полезные вещи о loadView и viewDidLoad. Что еще более важно, все ваши настройки представления должны быть помещены в метод viewDidLoad, и все подпредставления должны сохраняться только основным представлением (когда вы используете addSubview). Если вы сделаете это, то можете освободить главное представление (в didReceiveMemoryWarning это наиболее вероятное место). После этого любая ссылка на это представление (через self.view) перезагрузит представления и его подпредставления. Однако в этом процессе контроллер представления не освобождается и не освобождается.

ОБНОВЛЕНИЕ # 2 Вы можете использовать процесс, называемый отложенной загрузкой, для автоматического выделения и инициализации контроллера представления. В этом методе вы делаете экземпляр контроллера представления свойством объекта, который владеет им и использует его. Вы пишете свой собственный метод получения для этого контроллера представления, и в этом получателе вы проверяете, был ли создан экземпляр контроллера представления. Если это не так, вы создаете его в геттере. Затем верните экземпляр из геттера. Когда вы сделаете это, убедитесь, что вы установили экземпляр на ноль, когда вы его отпустите. (Вероятно, это хорошая идея, чтобы убедиться, что он не принадлежит / не используется повторно, когда вы делаете это.

Вот пример такого геттера:

- (MyVC*) myVC {
    if (!myVC) {
        myVC = [[MyVC alloc] initWithNib...];
        // include other things here that you might need for setting the VC up
    }
    return myVC;
}

Не забудьте установить значение ноль, когда вы отпустите его.

2 голосов
/ 30 января 2012

Да, но вы можете неправильно понимать отношения.dealloc означает, что объект уходит (а не просто покидает экран).init... означает, что объект создается (а не просто помещается на экран).init... после dealloc отправляется совершенно другому (вновь созданному) объекту.

Многие вещи, которые люди вкладывают в initWithNibName: или dealloc, на самом деле означают положить в viewWillAppear: иviewDidDisappear:.Размещение здесь логики гарантирует, что она вызывается, даже если один и тот же контроллер представления используется повторно.

...