2011-12-16 1 views
0

В следующем коде я использую UIPopoverController. Очевидно, я не выпускаю его здесь, потому что я не уверен, где я должен правильно выпустить его без сбоев.Как правильно освободить 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]; 
    } 
} 

Спасибо!

ответ

1

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

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

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

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

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

Вы должны:

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

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

self.popoverController = nil; 

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

+0

Ну я, это self.popoverController –

+0

К сожалению, обновленное мой ответ – gcamp

+0

Спасибо! Это сработало! –

0

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

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

- popoverControllerShouldDismissPopover:

и/или

- popoverControllerDidDismissPopover:

в зависимости от реализации.

Надеюсь, что это поможет.

+0

Я делаю это сейчас, но он говорит, что есть утечка в этом методе, хотя я это делаю –

0

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

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

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 
{ 
    [popoverController release]; 
} 
+1

Очень плохой способ отправить сообщения управления памятью на объекты, переданные в качестве параметров, они считаются автореализованными. Используйте свойства или ivars. –