2

次の方法でメモリリークが発生しない方法を理解しようとしています。Aが割り当てられますが、 or呼び出し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
    }
}

これは、基本的なメモリ管理の慣行に反しているようです。

ps ARC を有効にしていません。

4

2 に答える 2

3

これはまだメモリリークです!

クラスでポップオーバー コントローラーへの参照を保持するか、デリゲート メソッド popoverControllerDidDismissPopover: を実装する必要があります (そこで解放できます)。
ポップオーバー コントローラーは、その "present..." メソッドを呼び出すとそれ自体を保持せず、割り当てが解除され、まだ表示されている場合は例外をスローします

于 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 に答える