如何正确释放UIPopoverController?

时间:2011-12-16 01:51:24

标签: ios memory-management memory-leaks 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];
    }
}

谢谢!

3 个答案:

答案 0 :(得分:1)

您应该在视图控制器中保留对它的引用,并在完成后释放它。

但在这种情况下,您既要设置属性又要创建一个已保留的对象。

此处,[[UIPopoverController alloc]initWithContentViewController:imagePicker];会创建一个必须发布的保留对象。

但是您要将属性popoverController设置为该值,并且该属性的setter可能会保留该值。

你保留了两次弹出窗口并且永远不会释放它。

你应该:

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

当你完成了弹出窗口时:

self.popoverController = nil;

您应该审核memory management rules以明确说明或使用ARC

答案 1 :(得分:0)

如果您正在使用“自动引用计数”开发应用程序,则实际上并不需要担心发布。

如果你不是,或者只是好奇,你会在解除弹出窗口时调用的委托方法中释放它。这将是:

- popoverControllerShouldDismissPopover:

和/或

- popoverControllerDidDismissPopover:

取决于您的实施。

希望有所帮助。

答案 2 :(得分:0)

(不使用ARC)

我个人决定实现UIPopoverControllerDelegate并在那里发布:

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