2012-01-30 4 views

ответ

1

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

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

2

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

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

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

UPDATE # 2 Вы можете использовать процесс, называемый ленивой загрузкой, для автоматического распределения и инициализации вашего контроллера вида. В этом методе вы делаете экземпляр контроллера вида свойством объекта, который владеет и использует его. Вы пишете свой собственный метод getter для этого контроллера представления, и в этом getter вы проверяете, был ли уже создан экземпляр контроллера представления. Если это не так, вы создаете экземпляр в геттере. Затем верните экземпляр из получателя. Когда вы это сделаете, убедитесь, что вы установили нулевой экземпляр при его выпуске. (Это, вероятно, хорошая идея, чтобы убедиться, что она не принадлежит/retianed где-то еще, когда вы делаете это

Вот пример такого добытчика:.

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

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