#ios #memory-management #uipopovercontroller
#iOS #управление памятью #uipopovercontroller
Вопрос:
Я выполняю alloc / init с моим UIPopoverController, затем освобождаю его в методе делегирования. Всякий раз, когда я выполняю «сборку и анализ», я получаю предупреждения о памяти с «потенциальными утечками» — я делаю что-то не так или есть способ избавиться от этих предупреждений?
Большое спасибо!
- (void) somewhere {
MyViewController *vc = [[MyViewController alloc] init];
UIPopoverController *popover=[[UIPopoverController alloc] initWithContentViewController:vc];
[vc release];
// show the popover
[popover presentPopoverFromRect:[cell frame] inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
popover.delegate = self;
}
- (void) popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
[popoverController release];
popoverController = nil;
}
РЕДАКТИРОВАТЬ: показать завершение где-нибудь-функция
Ответ №1:
Прежде всего, в popoverControllerDidDismissPopover:
методе вы не должны выпускать popoverController
экземпляр, поскольку он будет выпущен фреймворком.
Во-вторых, в чем смысл этого somewhere
метода? Вы должны опубликовать полную реализацию здесь … Я полагаю, у вас отображается всплывающее окно, поэтому вам следует сделать что-то вроде этого:
- (void) somewhere {
// I suppose you have a local variable to hold the controller
_myPopover = [[UIPopoverController alloc] initWithContentViewController:vc];
_myPopover .delegate = self;
// ... do other things to configure the popover, if necessary
// I suppose you show it, with something like this
[_myPopover presentPopoverFromRect:yourRect inView:yourView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Затем, когда вам больше не нужен контроллер всплывающего окна, вы можете его освободить. Вы могли бы попробовать с вашим кодом, таким образом:
- (void) popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
[_myPopover release];
_myPopover = nil;
}
Таким образом, вы всегда будете хранить экземпляр всплывающего окна там, где он вам нужен, и выпускать его, когда закончите с ним. В вашей предыдущей реализации этот экземпляр ни к чему не был привязан.
Комментарии:
1. к сожалению, это не работает. вы не должны выпускать UIPopoverController («popover») там…
2. Если вы не сохраняете
popover
экземпляр локально в своем классе, он вам больше не нужен. Не могли бы вы, пожалуйста, опубликовать весь исходный код дляsomewhere
?3. Я все еще не согласен; если я помещу туда релиз, приложение вылетит. Из других вопросов SO: «UIPopoverController имеет немного другое управление памятью / владение. При появлении всплывающего окна память не сохраняется, поэтому вы не можете передать право собственности на ваш popviewcontroller представляющему объекту.»
4. Вы правы. И я был неправ… Я только что обновил ответ, когда появилось другое решение. Пожалуйста, попробуйте это? Я предлагаю вам хранить экземпляр popover controller локально в вашем классе.