在下面的代码中,我分配了一个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];
}
}
谢谢!
答案 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];
}