作为我的应用程序要求,我在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;
}
}
如果我使用上面的代码段,我有两个问题。
有没有更好的方法来避免上述两个问题?
答案 0 :(得分:1)
“添加图片”代码中存在内存泄漏。 ABPersonCopyImageData返回一个保留的NSData对象,在使用它初始化UIImage后需要释放它,如下所示:
NSData *contactImageData = (NSData*)ABPersonCopyImageData(contact);
UIImage *contactImage = [UIImage imageWithData:];
[contactImageData release];
一旦修复了泄漏,只要相应的表格单元格离开屏幕,就可以取消分配图像数据。这应该可以解决你的记忆和性能问题。
答案 1 :(得分:0)
预先缓存图片怎么样?如果您为每个单元访问Adressbook-Subsystem,可能是问题所在? 另一个问题可能是imageWithData调用,因为每次都必须从头开始构建映像。这里没有图像缓存。如果你在构建表之前这样做(用它访问cellForRow)并将预渲染的图像存储在带有密钥ABRecordID的NSMutableDictionary中?