内存泄漏加载缩略图图像

时间:2010-09-20 13:23:23

标签: iphone

使用sdk 4.1。当在表视图单元格中将缩略图图像加载到imageview时,我的内存占用量增加,然后崩溃(在Instruments中观察到)。此外,即使只有7-8个单元格,滚动也非常不稳定

    - (UITableViewCell *)tableView:(UITableView *)tableView  
            cellForRowAtIndexPath:(NSIndexPath *)indexPath {

     static NSString *FavouritesCellIdentifier = @"cellIdentifier";


 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) 
 {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:cellIdentifier] autorelease];

    UIImageView* imgView =  [[UIImageView alloc] initWithFrame:CGRectMake(10,
                                                                     16, 64, 64)];
    imgView.tag = kImageLabelTag;
    [cell.contentView addSubview:imgView];
    [imgView release];

   }

   UIImageView* imgView = (UIImageView*)[cell viewWithTag:kImageLabelTag];

    NSData *contactImageData = (NSData*)ABPersonCopyImageDataWithFormat(personRef,  
                                                    kABPersonImageFormatThumbnail);
    UIImage *img = [[UIImage alloc] initWithData:contactImageData];
   [imgView setImage:img]; 
   [contactImageData release];
  [img release];

    return cell;
  }

在viewdidunload中我设置了self.tableview = nil,无论如何都要释放单元格所持有的图像,因为即使导航到完全不同的viewcontroller,内存占用也会不断增长。只有在选择保存此tableview的viewcontroller时,内存才会启动。

2 个答案:

答案 0 :(得分:1)

崩溃的原因是你要发布你不应该使用的NSData对象。

表的滚动应该总是很慢,因为每次滚动时,它都会调用cellForRowAtIndexPath方法&用它将创建一个新的图像。

请尝试以下代码&让我知道它是否有效

- (UITableViewCell *)tableView:(UITableView *)tableView  
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *FavouritesCellIdentifier = @"cellIdentifier";


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) 
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:cellIdentifier] autorelease];

    UIImageView* imgView =  [[UIImageView alloc] initWithFrame:CGRectMake(10, 16, 64, 64)];
    imgView.tag = kImageLabelTag;
    [cell.contentView addSubview:imgView];
    [imgView release];

    NSData *contactImageData = (NSData*)ABPersonCopyImageDataWithFormat(personRef, kABPersonImageFormatThumbnail);
    UIImage *img = [[UIImage alloc] initWithData:contactImageData];
    [imgView setImage:img]; 
    [img release];

}

return cell;

}

答案 1 :(得分:0)

我认为你将CFDataRef转换为NSData的事实是个问题。我想release方法没有做任何事情,因为指针实际上是一个指向CFDataRef对象的指针,该对象应该使用CFRelease函数释放。

尝试:

UIImageView* imgView = (UIImageView*)[cell viewWithTag:kImageLabelTag];

CFDataRef contactImageData = ABPersonCopyImageDataWithFormat(personRef,  
                                                    kABPersonImageFormatThumbnail);
UIImage *img = [[UIImage alloc] initWithData:(NSData*)contactImageData];
[imgView setImage:img]; 
CFRelease(contactImageData);
[img release];