2

我试图弄清楚以下方法如何不会导致内存泄漏。AUIPopoverController已分配,但是,如果我包含autoreleaseorrelease调用,应用程序将崩溃,并显示 message '-[UIPopoverController dealloc] reached while popover is still visible.'

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {
    [mapView deselectAnnotation:view.annotation animated:TRUE];

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
        UIViewController *con = [[UIViewController alloc] init];
        UIPopoverController *poc = [[UIPopoverController alloc] initWithContentViewController:con];

        [con release];

        poc.popoverContentSize = CGSizeMake( 320, 320 );
        [poc presentPopoverFromRect:view.bounds inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:TRUE];
    }
    else {
        ;   // TODO (miked): display stuff another way
    }
}

这似乎违背了基本的内存管理实践。

ps 我没有启用 ARC。

4

2 回答 2

3

这仍然是内存泄漏!

您必须在类中保留对 popover 控制器的引用和/或实现委托方法 popoverControllerDidDismissPopover:(您可以在那里释放它)。
当您调用它的“present ...”方法时,popover 控制器不会保留自己,如果它被释放并且仍然可见,则会引发异常

于 2012-05-25T19:43:30.400 回答
1

实现 UIPopoverControllerDelegate 的

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController method and do the following.

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {

    if(popoverController == yourPopoverController)

    {

            [popoverController release];

    }

}
于 2012-05-25T19:42:39.283 回答