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