大家好 我有一个UITableView,其中包含从sqllite获取的项目列表。但渲染视图时会出现内存泄漏。以下是我的cellForRowAtIndexPath方法。
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行“unit count is 2”(我在整个屏幕中有3个项目)。但是当我拖动屏幕让UITableView显示下一个项目时,控制台显示“单位数为1”。调用[tableView reloadData]方法时,控制台也会显示“unit count is 1”。所以似乎UITableView会自动释放数据源。这就是为什么我保持单位的内存引用计数为2,否则,过度释放将发生。但是成本是单位占用的内存永远不会被释放!
答案 0 :(得分:1)
对象的绝对保留计数毫无意义。
您应该调用release
与导致保留对象完全相同的次数。不会少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。
有关详细信息,请参阅Memory Management Guidelines。
您所描述的unit
的保留计数并不奇怪。您的代码似乎正在打印在当前通过事件循环期间可能创建或未创建的对象的保留计数,因此可能已多次保留/自动释放。或不。没关系。
分配工具显示的内容是什么。你是否看到随着时间推移物体的增加?如果是这样,他们是什么以及保留他们的是什么(或者不释放他们)?
如果这样做,可能会Heapshot analysis对您有用。