没有ARC的UITableViewCell标识符泛滥内存

时间:2014-03-06 13:56:35

标签: ios objective-c uitableview automatic-ref-counting

我正在开发一个没有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。

感谢。

2 个答案:

答案 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];
}

单独负责单元初始化,你不需要另一条线。