UIPopoverController и релиз в методе делегирования; «потенциальная утечка памяти»

#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 локально в вашем классе.