Как правильно выпустить UIPopoverController? - PullRequest
0 голосов
/ 16 декабря 2011

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

Где мне его выпустить?

- (IBAction)photoLibraryiPad {
    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    {
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;

        self.popoverController = [[UIPopoverController alloc]
                                  initWithContentViewController:imagePicker];
        popoverController.delegate = self;
        [self.popoverController presentPopoverFromRect:myButton.frame inView:self.view
                              permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        [imagePicker release];
    }
}

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Вы должны сохранить ссылку на него в контроллере вида и отпустить его, когда закончите.

Но в этом случае вы одновременно устанавливаете свойство и создаете уже сохраненный объект.

Здесь [[UIPopoverController alloc]initWithContentViewController:imagePicker]; создает сохраненный объект, который вы должны освободить.

Но вы устанавливаете свойство popoverController на это значение, и установщик этого свойства, вероятно, сохраняет это значение.

Вы сохраняете поповер дважды и никогда не выпускаете его.

Вы должны:

UIPopover* popover = [[UIPopoverController alloc]
                                  initWithContentViewController:imagePicker];
self.popoverController = popover;
[popover release];

И когда вы закончите с поповером:

self.popoverController = nil;

Вам, вероятно, следует пересмотреть свои правила управления памятью , чтобы прояснить это или использовать ARC.

0 голосов
/ 02 марта 2012

(без использования ARC)

Я лично решил реализовать UIPopoverControllerDelegate и выпустить его там:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    [popoverController release];
}
0 голосов
/ 16 декабря 2011

Если вы разрабатываете приложение с «Автоматическим подсчетом ссылок», вам на самом деле не нужно беспокоиться о выпуске.

Если это не так или просто любопытно, вы бы выпустили его вметод делегата, который вызывается при закрытии поповера.Что будет:

- popoverControllerShouldDismissPopover:

и / или

- popoverControllerDidDismissPopover:

, в зависимости от вашей реализации.помогает.

...