这怎么不是记忆泄漏

时间:2012-05-25 19:36:20

标签: objective-c ios memory-management

我试图找出以下方法如何导致内存泄漏。已分配UIPopoverController,但如果我包含autoreleaserelease来电,应用程序会崩溃,并显示消息'-[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
    }
}

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

P.S。我没有启用ARC。

2 个答案:

答案 0 :(得分:3)

这仍然是内存泄漏!

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

答案 1 :(得分:1)

实施UIPopoverControllerDelegate的

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

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

    if(popoverController == yourPopoverController)

    {

            [popoverController release];

    }

}