0

popOver にメニュー (tableView で構成される) のみを表示する関数を作成しています。

これはソースコードです:

-(void)pushSearch:(NSString *)option type:(int)optionType
{
    searchNav = [[iNavigation alloc] initWithNibName:@"iNavigation" bundle:nil] ;
    //This is the UIViewController with the tableView

    [searchNav setSearchMode:optionType];

    searchNav.view.frame =CGRectMake(0,0,300,600);

    NSLog(@"Retain Count: %d",[searchNav retainCount]);

//この時点で保持カウントは 1 です

    if ([pop isPopoverVisible])
    {
        [pop dismissPopoverAnimated:YES];
        [pop release];
    }

    pop = [[UIPopoverController alloc] initWithContentViewController:searchNav];

    NSLog(@"Retain Count: %d",[searchNav retainCount]);
    //At this point retain count is 2



    [pop presentPopoverFromRect:btnMenu.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    [pop setPopoverContentSize:CGSizeMake(350,600)];

    NSLog(@"Retain Count: %d",[searchNav retainCount]);
    //At this point retain count is 5!!!

    [searchNav release];

}

私が抱えている問題は、テーブルビューをロードするために使用されたメモリが解放されないことです。私のアプリは、クラッシュするまでメモリ内で成長し続けます。

searchNav の割り当てを 1 つだけ行っている場合、それを popOver に割り当てた後、reatin カウントが 5 になるのはなぜですか?

助けてください。

4

2 に答える 2

4

-retainCount は使用しないでください。

オブジェクトの絶対保持カウントは無意味です。

releaseオブジェクトを保持させたのとまったく同じ回数呼び出す必要があります。それ以下ではなく (リークが好きでない限り)、もちろんそれ以上でもありません (クラッシュが好きでない限り)。

詳細については、メモリ管理ガイドラインを参照してください。


保持カウントが 5 であることは無関係であり、さまざまなフレームワークの内部実装の詳細が原因である可能性が非常に高いです。

そのコードのメモリ管理searchNavは正しいです。オブジェクトを割り当て (+1 保持)、最終的に解放しました (-1 保持)。したがって、メモリリークは別の場所にあります。

ソースで「ビルドと分析」を使用してみてください。次に、Allocations インストゥルメントを使用して、時間の経過とともにアプリが成長するにつれてぶらぶらしているオブジェクトを調べます。どこかに過剰保持があります。リリースとのバランスを取っていない保持。

于 2010-11-26T20:38:21.987 に答える
0

をリリースしUIPopoverControllerますか?おそらく、そのオブジェクトはまだテーブル ビューを保持しています。

于 2010-11-27T00:39:17.053 に答える