UIPopoverController и выпуск в делегат-методе; «потенциальная утечка памяти» - PullRequest
0 голосов
/ 25 мая 2011

Я делаю 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 Ответ

0 голосов
/ 25 мая 2011

Прежде всего, в методе 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;
}

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

...