как освободить UIVIewController после удаления его вида - PullRequest
0 голосов
/ 31 августа 2011

Как освободить контроллер представления, созданный так:

VCClass *vc = [[VCClass alloc] initWithNibName:@"VCClass" bundle:nil];
[self.view addSubview:vc.view];

, чтобы появилось представление, выделен UIViewController.Теперь я хочу выпустить его из VCClass.Я вызываю внутри VCClass:

[self.view removeFromSuperView];

мой вопрос, где я должен выпустить объект "vc", прикрепленный к удаленному представлению.Есть ли хороший способ уведомить viewcontroller, который может быть выпущен при освобождении view?

Ответы [ 4 ]

1 голос
/ 31 августа 2011

addSubview делает +1 к счету сохранения, и обычно хорошей практикой является выпуск, как только он вам не нужен, и вы передаете его другому указателю. Это как стеклянный шарик, его передают вручную, а если никто не держит, он падает на землю и разбивается.

Пример:

UIView *sampleView = [[UIView alloc] init]; // Retain count: 1
[self.view addSubview:sampleView];          // Retain count: 2
[self.view release];                        // Retain count: 1

Когда вызывается removeFromSubview:, объект будет освобожден:

[sampleView removeFromSuperView];           // Retain count: 0

Это для управления памятью.

Отвечая на ваш вопрос, более безопасный способ сделать то, что вы хотите сделать (загрузить только часть ViewController из кончика (я предполагаю, что вы используете кончик, потому что вы использовали @"VCClass" в * 1013) *), использовать его следующим образом:

NSArray *nib =  [[NSBundle mainBundle] loadNibNamed:@"VCClass" owner:self options:nil];

UIView *view = (UIView*)[nib objectAtIndex:0];

Это работает, загружая NibName в память, а затем крадя первый элемент (если у вас есть только UIView внутри, тогда он выберет это, как самый верхний элемент). Это делается аналогично для UITableViewCells при загрузке их из nib-файлов. Nib-файлы автоматически высвобождаются, и это имеет больше смысла, поскольку вы, очевидно, просто заботитесь о самом представлении, а не о контроллере.

0 голосов
/ 31 августа 2011

[self.view removeFromSuperView];должен освободить ваш вид из памяти.Хотя имейте в виду, что это не будет правдой, если ваше представление было сохранено любым другим объектом, чье количество сохраненных записей больше 1. Также посмотрите второй ответ в этой теме.

Есть ли в UIViewМетод removeFromSuperView удалить UIView из памяти

0 голосов
/ 31 августа 2011

Представления не знают о своих контроллерах представления, за исключением слабой ссылки на делегата.Это делается для того, чтобы избежать круговой ссылки, среди других причин.У венчурных капиталистов часто есть жизнь вне их представлений - следовательно, сообщений viewDidLoad и viewDidUnload.Например, в течение всего жизненного цикла приложения панели вкладок виртуальные контроллеры для каждой вкладки могут проходить через много разных экземпляров представления, но никогда не освобождаются.Поэтому вам следует избегать, чтобы представление выпускало свой собственный контроллер представления.

Зачастую класс, который выделил VC, должен быть тем, чтобы освободить его.В предоставленном вами коде у вас есть:

VCClass *vc = [[VCClass alloc] initWithNibName:@"VCClass" bundle:nil];
[self.view addSubview:vc.view];

Класс контроллера, в котором находится приведенный выше код, вероятно, лучше всего подходит для выпуска VC.Возможно, вам придется разработать вызов делегата только для этой цели.

0 голосов
/ 31 августа 2011

После удаления добавьте звонок на

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