2011-06-17 3 views
0

私はxcode4で計測器を動かし、次のコードで2つのリークがあったと教えてくれました(****と記されています)。私はptでコードを使ってメモリ解放を世話したと思った。 Aとpt。 B.pushViewControllerの周りにこのメモリリークを修正するには?

ここでいくつかの関連トピックを読みましたが、それを修正する理由と方法をまだ理解できませんでした。

もう1つの質問は、 Aが必要です。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //Get the dialog id 
    NSDictionary *rowData = [dialogs objectAtIndex:indexPath.row]; 
    NSInteger dialogId = [[rowData objectForKey:@"id"] intValue]; 

    DialogViewController *detailViewController = [[DialogViewController alloc] initWithNibName:@"DialogViewController" bundle:nil]; 
    detailViewController.dialogId = dialogId; 
    NSString *title = [NSString stringWithFormat:@"%d. %@", [[rowData objectForKey:@"id"] intValue], [rowData objectForKey:@"title"]]; 
       ****** i  6.8% 
    [detailViewController.dialogTitle release];    // pt. A 
    detailViewController.dialogTitle = [title retain]; 

    [self.navigationController pushViewController:detailViewController animated:YES]; 
       ****** i 93.2% 
    [detailViewController release];       // pt. B 

} 

ありがとうございます! 呂

答えて

1

ある場合pushViewController上記ラインは

detailViewController.dialogTitle = [[title retain] autorelease]; 

なければならない。これは、解放/保持コールかどうかなど、うまく機能しなければならない点Aで必要な依存あなたのdialogTitleプロパティの定義方法について。

@property(retain)として定義した場合は、(retain)プロパティに値を割り当てると自動的に保持されるため、古い値を解放するか新しい値を保持する必要はありません。また、(retain)プロパティに新しい値を代入すると、古い値が解放されるため、解放する必要もありません。あなたは、この場合に必要となるすべては、次のとおりです。

detailViewController.dialogTitle = title; 

ポイントAポイントBについては

に保持/あなたがリリースを何をする必要があります(割り当て)、あなたが必要なのでしょとしてあなたはdialogTitleを定義した場合そうしないと、detailViewControllerオブジェクトが決して削除されないため、そこから解放する必要があります。 alloc/initedの場合、保持カウントは1になります。View Controllerを押すと、保持されます(したがって、保持カウントは2になります)。その後、メソッドの最後に解放され、保持カウントは1になります。次に、それを含むナビゲーションコントローラが終了すると、再び解放されます。保持カウントは0になり、削除されます。

メソッドの最後にdetailViewControllerを解放する代わりに、/ initを割り当てるときにメソッドを自動解放し、メソッドの最後にリリースを削除することもできます。オートレリースすることで、次回autoreleaseプールがクリアされたときに自動的に解放されるようにマーキングしています(このメソッドが終了してすぐに終了します)。

+0

rekle、ありがとうございます!だから、なぜXcode4のリークツールがpt.Bにリークとしてフラグを立てているのか知っていますか?それを偽陰性とするか、DialogViewControllerにリークがある可能性がありますか?何をお勧めしますか? –

0

dialagTitleプロパティを保持

detailViewController.dialogTitle = title; 
関連する問題