iPhone вид загружался много раз ... но никогда не выгружался? - PullRequest
1 голос
/ 29 ноября 2010

Приложение для моего iPhone основано на обычном «служебном шаблоне», как собственное приложение Apple от Weather.

Я нажимаю на информационную кнопку, и она переворачивает экран. Я нажимаю на кнопку Готово ... и она переворачивается. Кажется, что эта часть работает нормально.

Я поместил операторы NSLog () в каждый из 4 методов в моем FlipSideViewController.m

viewDidLoad
viewWillAppear
viewDidUnload
viewWillDisappear

Разве я не должен видеть, что viewDidLoad и viewDidAppear вызываются, когда я переворачиваю на свою панель FlipSide. А затем увидеть viewWillDisappear и viewDidUnload, когда я переворачиваюсь назад?

Вместо этого я никогда не вижу никакого вызова viewDidUnload. Но я действительно вижу другой viewDidLoad каждый раз, когда переворачиваю на свой FlipSide. Это что не так?

Переворачиваясь взад-вперед, снова и снова я вижу:

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

viewDidLoad
viewWillAppear
viewWillDisappear

Разве это не означает, что представление перезагружается 3 раза ... но выгружается 0 раз? Разве здесь не должно быть "соответствующих" методов загрузки / выгрузки и появления / исчезновения?

1 Ответ

7 голосов
/ 29 ноября 2010

Сначала я тоже так думал, но, видимо, это не так.

Метод viewDidUnload фактически вызывается только тогда, когда контроллер представления получает предупреждение о памяти.

Тем не менее,представление будет освобождено, когда контроллер представления будет освобожден.

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

РЕДАКТИРОВАТЬ: чтобы освободить view, вам просто нужно вызвать dealloc на суперкласс UIViewController в вашем dealloc:

- (void) dealloc
{
    // release your stuff, anything that you alloc or retain in your class

    // then call `dealloc` on the super class:
    [super dealloc];
}

в методе viewDidUnload вам нужно только выпустить вещи, которые должны быть выгружены вместе с вашим представлением, обычно то, что вы подключили к IBOutlet sв конструкторе интерфейсов.

- (void) viewDidUnload
{
    // if the property was declared with the "retain" keyword, you can
    // release it simply by setting it to nil like this:
    self.myOutlet = nil;
}
...