2011-01-04 14 views
1

こんにちはすべて 私はsqlliteからフェッチされた項目のリストを持つUITableViewを持っています。しかし、ビューをレンダリングするときにメモリリークがあります。以下は私のcellForRowAtIndexPathメソッドです。UITableViewのメモリリークの問題

static NSString *CellIdentifier = @"BarListItemCell"; 


BarListItemViewCell *cell = (BarListItemViewCell *)[tableView 
            dequeueReusableCellWithIdentifier: CellIdentifier]; 
if (cell == nil) { 
    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"BarListItemViewCell" owner:self options:nil]; 
    for (id cellObject in nib) { 
     if ([cellObject isKindOfClass : [BarListItemViewCell class]]) { 
      cell = (BarListItemViewCell *) cellObject; 
      //break; 
     } 
    } 
    NSString * key = [keys objectAtIndex:[indexPath section]]; 
    NSDictionary * unit = [[barListDataSource objectForKey:key] objectAtIndex:[indexPath row]]; 

    NSLog(@"unit count is %d", [unit retainCount]); 

    cell.name.text = [unit objectForKey:@"name"]; 
    cell.address.text = [unit objectForKey:@"address1"]; 
    cell.features.text = [unit objectForKey:@"features"]; 
    cell.logo.image = [UIImage imageWithData:[unit objectForKey:@"logo"]]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
}  
return cell; 

"NSLog(@ユニット数は%d"、[unit retainCount])です "という行が表示されます。 viewDidLoadの後、コンソールは3つの行を表示します。「ユニット数は2です」(私は画面全体に3つの項目があります)。しかし、画面をドラッグしてUITableViewに次の項目を表示させると、コンソールに "unit count is 1"と表示されます。 [tableView reloadData]メソッドが呼び出されると、コンソールに「unit count is 1」と表示されます。したがって、UITableViewは自動的にデータソースを解放するようです。だから私はユニットのメモリ参照カウントを2にしておきます。さもなければ、解放が起こります。しかし、コストは、ユニットが占有するメモリが決して解放されないことです!

答えて

1

-retainCountをコールしないでください。

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

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

詳しくは、Memory Management Guidelinesを参照してください。


あなたが記述するものからunitの保持カウントについて奇妙なものは何もありません。あなたのコードは、イベントループを通る現在のパスの間に作成されたオブジェクトと作成されていないオブジェクトの保持カウントを表示しているようです。したがって、複数回保持/自動解放されている可能性があります。か否か。それは問題ではありません。

Allocations Instrumentの表示内容は重要です。時間がたつにつれて物体の付着が見えますか?もしそうなら、彼らは何であり、何を保持している(または解放していない)のだろうか?

あなたがそうすると、Heapshot analysisがあなたに役立つことがあります。

+0

答えていただきありがとうございます。まず、メモリ管理ガイドラインをお読みになります。しかし、状況は、私は常にデータソースにautoreleaseメソッドを送ることができないことを意味するUITableViewのデータソースの所有権を取らなければならないということです。しかし、[tableView reloadData]が呼び出される前に、データソース参照を新しいリスト/辞書に割り当てます。つまり、前に手動で前のデータソースを解放する必要がありますか? – Shenjun