ARC: когда установить viewController на ноль - PullRequest
1 голос
/ 13 марта 2012

Я все еще немного борюсь с идеей ARC. Предположим, у меня есть два очень сложных viewController A и B, каждый из которых содержит множество изображений, которые сохраняются каждым видом. Ради аргумента, давайте предположим, что первый ViewController (A) сохраняет изображения, которые занимают 75 МБ в оперативной памяти. Другой (B) также занимает 75 МБ.

В моем делегате приложения я настроил свой NavigationController следующим образом:

ViewControllerA *vcA = [[ViewControllerA alloc] init];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vcA];
[navController.navigationBar setHidden:YES];
[[self window] setRootViewController:navController];

Когда я переключаюсь с A на B, я делаю это так во ViewControllerA.m:

ViewControllerB *vcB = [[ViewControllerB alloc] init];
[[self navigationController] pushViewController:vcB animated:YES];

Когда я переключаюсь обратно, я делаю это так в ViewControllerB.m:

[[self navigationController] popToRootViewControllerAnimated:YES];

Теперь мой большой вопрос, если у меня все еще есть ViewController A в моей памяти, когда я нахожусь в ViewController B? В этом случае, когда компилятор выпускает ViewController? Могу я или я должен выпустить (т.е. установить его на ноль) один ViewController, когда он не используется?

Извините, если ответ ясен или я полностью упускаю суть. Так что любые ответы и объяснения будут высоко оценены.

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Я не могу помочь вам с ARC, потому что я никогда не использовал его (и я не знаю, действительно ли я хочу).

Но я могу сказать вам одну вещь:

Когда вы нажимаете ваши ViewControllers, они все находятся в стеке навигации. И пока они находятся в стеке, они остаются в памяти.

Без использования ARC, если я автоматически выпущу eatch viewController, который я нажимаю, он будет выпущен точно тогда, когда я вытолкну его из стека.

Если кто-то знает больше об ARC (и когда он выпускает выделенный объект), я был бы рад получить больше информации.

Спасибо

1 голос
/ 13 марта 2012

Да, у вас все еще есть ViewControllerA (вы можете увидеть это с помощью инструментов в следующий раз).Это не имеет ничего общего с ARC, то же самое и без него.Позвольте мне объяснить:

Вы создаете UINavigationController и помещаете UIViewController A в качестве корня, A сохраняется (в ARC это сильное свойство или что-то в этом роде), как вы видите, UINavigationController нуждается в этом правильно?Теперь вы нажимаете UIViewController B, B и A существуют в памяти, вам UINavigationController все еще нужен UIViewController A, он просто не отображается, и представление может быть выгружено, если системе требуется память, но не освобождает A. Когда вы открываете UIViewController B, он выпущен, и если для него нет ссылок (опять же, я полагаю, именно так работает ARC), он освобождается.

Теперь ваш вопрос: когда освобождается rootViewController?Ну, UINavigationController всегда имеет рут!Итак, пока у вас есть UINavigationController, у вас есть rootViewController.

Дайте мне знать в комментариях, если вам нужны дальнейшие объяснения.

0 голосов
/ 13 марта 2012

Ваш контроллер вида A будет сохранен navController, поэтому он не будет освобожден. Даже если вы установите vcA на ноль, оно не будет выпущено, потому что navController сохраняет его. Проблема в том, что ваш контроллер сохранил много ресурсов (изображений), которые занимают много памяти. Чтобы решить эту проблему, вы можете выделить ресурсы на viewDidLoad и освободить их на viewDidUnload

например

// in your view controller
- (void)viewDidLoad {
    [super viewDidLoad];
    self.image = // read image to memory
}

- (void)viewDidUnload {
    [super viewDidUnload];
    self.image = nil; // release the image to free memory
}

Затем, после того как контроллер представления B будет отправлен в navController, контроллер представления A получит уведомление от UIKit о том, что это не контроллер отображения, и при необходимости выгрузит представление, чтобы освободить память для использования другим классом.

...