UIPopoverController и контент ViewController - вопрос управления памятью - PullRequest
1 голос
/ 30 июня 2011

Пожалуйста, проверьте мой подход к выпуску как UIPopoverController, так и loadViewController


- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
    LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain]; 

    self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];
    self.loadPopover.delegate = self;

    [self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];   

    [loadViewController release];
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

    [popoverController.contentViewController release];
    self.loadPopover = nil;
    [_loadPopover release]; 
}

Как вы видите, я выпускаю loadViewController дважды, и код работает, никаких утечек, но у меня есть некоторые сомнения. Если я освобождаю его один раз, то loadloc не вызывается в loadViewController.

1 Ответ

1 голос
/ 30 июня 2011

Если ваше свойство loadPopover сохранено / скопировано, следующая строка: чрезмерное сохранение объекта и утечки:

self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];

Оба, alloc-init и средство доступа к свойствусохранить объект.Это должно быть:

self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];

Вот почему объект loadPopover освобождается только в том случае, если вы отправляете ему два сообщения об освобождении, но вы никогда не должны прибегать к этим уловкам .

РЕДАКТИРОВАТЬ:

У вас также есть другая проблема управления памятью.Вы отпускаете объект, который вам не принадлежит, в этой строке:

[popoverController.contentViewController release];

Ответственность за сохранение / освобождение contentViewController лежит на popoverController.Делая это, вы преувеличиваете contentViewController.

Подводя итог, ваш код будет выглядеть так:

- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
    LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain]; 

    self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];
    self.loadPopover.delegate = self;

    [self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];   

    [loadViewController release];
}

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    self.loadPopover = nil;
}
...