带有联系人图像问题的UITableView

时间:2010-03-14 09:16:03

标签: iphone objective-c

作为我的应用程序要求,我在UITableView中显示联系人图像,如下所示。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath
                                                              (NSIndexPath *)indexPath
{
    //NSMutableArray *sourceArray = sourceList;
    static NSString *identifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil)
    {
        //If not possible create a new cell
        cell = [[[UITableViewCell   alloc]initWithStyle:UITableViewCellStyleDefault                     
             reuseIdentifier:identifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        cell.opaque = NO;

        CGRect LabelFrame = CGRectMake(130, 33, 150, 13);
        callImage = [[UIImageView alloc] initWithFrame:LabelFrame];//phone image
        callImage.tag = 1;
        [cell.contentView addSubview:callImage];
        [callImage release];
            -----
            -----
    }
    UIImageView *callImage = (UIImageView *)[cell viewWithTag:1];
    ABRecordRef contact = [self getContact];
    if(contact && ABPersonHasImageData(contact))
    {
        UIImage *contactImage = [UIImage imageWithData:(NSData*)ABPersonCopyImageData(contact)];
        callImage.image =  contactImage;
    }
}

如果我使用上面的代码段,我有两个问题。

  1. 表滚动太慢了。如果评论“添加图像”代码,则UITable响应速度非常快。
  2. 内存管理。我的应用程序开始使用25 - 30 MB的RAM。
  3. 有没有更好的方法来避免上述两个问题?

2 个答案:

答案 0 :(得分:1)

“添加图片”代码中存在内存泄漏。 ABPersonCopyImageData返回一个保留的NSData对象,在使用它初始化UIImage后需要释放它,如下所示:

NSData *contactImageData = (NSData*)ABPersonCopyImageData(contact);
UIImage *contactImage = [UIImage imageWithData:];
[contactImageData release];

一旦修复了泄漏,只要相应的表格单元格离开屏幕,就可以取消分配图像数据。这应该可以解决你的记忆和性能问题。

答案 1 :(得分:0)

预先缓存图片怎么样?如果您为每个单元访问Adressbook-Subsystem,可能是问题所在? 另一个问题可能是imageWithData调用,因为每次都必须从头开始构建映像。这里没有图像缓存。如果你在构建表之前这样做(用它访问cellForRow)并将预渲染的图像存储在带有密钥ABRecordID的NSMutableDictionary中?