2011-12-16 101 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 – 2011-12-16 01:58:38

+0

對不起,更新我的回答 – gcamp 2011-12-16 02:26:48

+0

謝謝!有效! – 2011-12-16 02:34:53

0

如果您使用「自動引用計數」開發應用程序,則實際上不需要擔心發佈。

如果您不是,或者只是好奇,您可以在解除彈出窗口時調用的委託方法中釋放它。具體做法是:

- popoverControllerShouldDismissPopover:

和/或

- popoverControllerDidDismissPopover:

取決於您的實現。

希望有所幫助。

0

(不使用ARC)

我個人決定實施UIPopoverControllerDelegate並釋放有:

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