0

ポップオーバー ビューを使用して、選択できる大量のフラグを表示しています。このポップオーバーメモリを開いた直後に解放されないため、コードに問題があります(ビューコントローラー「flagsViewController」は問題なくクリーンであり、内部のすべてのアイテムを初期化して解放します.

私は何を間違っていますか?ポップオーバーが閉じられたらすぐにメモリを解放するにはどうすればよいですか?

    -(void)presentFlags
    {
        [self.popoverController dismissPopoverAnimated:YES];

        FlagsViewController *controller = [[FlagsViewController alloc] 
                                            initWithNibName:@"FlagsViewController" 
                                            bundle:[NSBundle mainBundle]] ;

        UINavigationController *container = [[UINavigationController alloc] initWithRootViewController:controller];

        UISegmentedControl *ctrl = [[UISegmentedControl alloc] initWithItems:segmentedItems];
        ctrl.frame = CGRectMake(0, 6, 500, 30);
        [ctrl addTarget:self action:@selector(changeSeg:) forControlEvents:UIControlEventValueChanged];
        ctrl.segmentedControlStyle = UISegmentedControlStyleBar;
        //ctrl.momentary = YES; 
        ctrl.tintColor  = [UIColor darkGrayColor];
        UIImage *theImage = [UIImage imageNamed:@"highlight_country.png"];

        [ctrl setImage:theImage forSegmentAtIndex:0];

        [container.navigationBar addSubview:ctrl];
        [ctrl release];
        //
        //create a popover controller
        self.popoverController = [[[UIPopoverController alloc]
                                   initWithContentViewController:container] autorelease];
        [container  release];
        [popoverController setPopoverContentSize:CGSizeMake(500, 600)];
        //present the popover view non-modal with a
        //refrence to the button pressed within the current view
        [popoverController presentPopoverFromRect:CGRectMake(popoverArrowPossition, 0.0, 0.0, 52.0) inView:super.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        [controller release];
}
4

1 に答える 1

2

UIPopoverController の操作はかなり困難でしたが、次のように Popover Controller の Delegate を self( popoverController.delegate = self) に設定し、UIPopoverControllerDelegate プロトコルをクラス ヘッダーに追加することで、この問題を解決しました。

次に- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverControllerデリゲート メソッドを実装し、ここで popoverController を解放して nil に設定しました。

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [self.popoverController release];
    self.popoverController = nil;
}

注意: このデリゲート メソッドは、コードを介して (つまり、dismissPopoverAnimated を使用して) ポップオーバーを閉じた場合には呼び出されません。このユーザーがポップオーバーの外側をタップして閉じた場合などにのみ呼び出されます。

于 2011-08-26T15:47:32.440 に答える