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