0

私は持っている@property(nonatomic,retain) UIPopoverController * popoverController;

実装クラスでポップオーバーを作成します。

私はこれを使用します:

- (void)createPopover:(NavigationController *)tempNavigation {

            UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:tempNavigation];
            self.popoverController = tempPopover;
            [self.popoverController setPopoverContentSize:CGSizeMake(width, height)];
            tempPopover.delegate = self;                

            CGRect selectedRect = [self.tableView rectForRowAtIndexPath:indexPath];             
            [tempPopover presentPopoverFromRect:selectedRect inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
            [tempPopover release];
}

この方法では、ポップオーバーを解放する必要があります

私はこれを使用します:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if (popoverController) {
        [popoverController dismissPopoverAnimated:NO];
        self.popoverController=nil; 
        [popoverController release];
    }
    return YES;
}

私の質問: この方法でポップオーバーを解放するこの正しい方法。または、dealloc メソッドでのみポップオーバーを解放する必要がありますか?

4

1 に答える 1

1
self.popoverController=nil;

セッターを呼び出します。プロパティが保持として宣言されている場合、これは以前の値を解放し、新しい値を保持します (この場合、何もしない nil を保持します)。

[popoverController release];

現在は何もしない nil になっている popoverController で release を呼び出します。ただし、これを行うべきではありません。nil でない場合は、オーバー リリースされます (次に popoverController プロパティを設定したときに release が呼び出されるため)。

プロパティを設定するときにも問題があります

UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:tempNavigation];
self.popoverController = tempPopover;

セッターは値を保持するため、自動解放する必要があります

self.popoverController = [tempPopover autorelease];

そして、ARCを使用する必要があります:)

于 2012-04-19T12:17:05.287 に答える