Несколько вопросов: жизненный цикл UIViewController; отпустите настройку на ноль - PullRequest
1 голос
/ 23 октября 2009

У меня есть пара вопросов, касающихся UIViewController:

1) Когда каждый из методов вызывается для UIViewController? В частности, разница между viewDidLoad, viewDidUnload и dealloc.

2) В чем разница, в общем , при установке указателя равным нулю и освобождении указателя? Я знаю, что в viewDidUnload вы должны установить его равным nil, но в release Callall.

ОБНОВЛЕНИЕ: Извините, только что понял, что вопрос вводит в заблуждение. Я имел в виду не dealloc, а когда initWithNibName: bundle: и вызывается release? Только один раз по IB, верно?

Ответы [ 2 ]

1 голос
/ 23 июня 2010
pointer = nil; // just clears the variable in which you store the pointer, but does not free memory.

[pointer release]; // just frees the object (memory), but does not clear the variable used to point to it.

self.pointer = nil; // sets the variable to nil.  Also releases the object ONLY if pointer is a @property(retain) ivar.

Один простой способ увидеть, когда вызываются различные методы, это сделать в вашем UIViewController:

- (void)viewDidLoad
{
    NSLog(@"MyViewController::viewDidLoad");
    [super viewDidLoad];
    // the rest of your viewDidLoad code, here.
}

// Etc., for the other methods of interest.

ПРИМЕЧАНИЕ: многое можно почерпнуть из переопределения retain и release в log, а затем следовать в отладчике.

1 голос
/ 23 октября 2009

Установка указателя на ноль не освобождает память, на которую он указывает.

Когда вы делаете что-то вроде

self.pointer = nil;

как правило, свойство имеет атрибут retain. В этом случае установка свойства равным nil косвенно вызовет

[pointer release];
pointer = nil;

В случае методов контроллера представления, viewDidLoad вызывается, когда ваше представление загружено, либо из кончика, либо программно. Точнее, он вызывается сразу после вызова -loadView. Вам не нужно вызывать loadView вручную, система сделает это. Метод viewDidUnload вызывается в случае предупреждения памяти, и представление вашего контроллера представления не на экране. Впоследствии loadView и viewDidLoad будут вызываться снова по требованию.

Метод dealloc, как обычно, вызывается, когда счетчик сохранности вашего объекта достигает 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...