我正在开发一个没有ARC的旧项目。它有很多错误,代码看起来很难看,我正在重写它。
快速查看我的代码
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
cell = [self createCellWithInfo:[self.search objectAtIndex:indexPath.row]];
return cell;
}
-(UITableViewCell *)createCellWithInfo:(NSDictionary *)info{
UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@“Cell”] autorelease];
//set image for cell
//set text for cell.textlabel
//set text for cell.detailTextLabel
//create an UIButton and add to cell.content view
return cell;
}
重点是这一行代码
[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@“Cell”] autorelease]
如果我在这里使用@"Cell"
,那么当我在桌面上不停地上下滚动时,内存会上升。
滚动约15秒后,我的iphone 5c变得滞后。
如果我将其设置为nil
,一切都很好。
有人可以解释一下吗?我不喜欢非ARC。
感谢。
答案 0 :(得分:5)
在if
块内部,您正在创建单元而不调用自动释放,这会在没有ARC的情况下泄漏内存。
在if
块后你无论如何重建它(无论它是否被回收),这次使用autorelease,你应该做的就是重置它的相关属性,这样你就可以成功重用一个再生细胞(或配置新细胞)。
尝试按以下方式更换代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
[self updateCell:cell withInfo:[self.search objectAtIndex:indexPath.row]];
return cell;
}
-(void)updateCell:(UITableViewCell *)cell withInfo:(NSDictionary *)info{
//set image for cell
//set text for cell.textlabel
//set text for cell.detailTextLabel
//create an UIButton and add to cell.content view
}
答案 1 :(得分:0)
UITableViewCell *cell = [self.table dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}
单独负责单元初始化,你不需要另一条线。