如何摆脱uitableview单元格中模糊图像的大量内存泄漏

时间:2013-10-23 16:59:46

标签: ios objective-c cocoa-touch uitableview ios7

当我滚动到我的桌子的底部(仅96个项目)时,我得到1 GB的内存使用量(对于每个创建的单元格,它会增加。我有一张表格,图像前面有一个模糊的图像它使用原始图像的裁剪版本,然后在文本之上。非常简单。我正在使用苹果提供的示例代码来模糊图像:https://github.com/iGriever/TWSReleaseNotesView/blob/master/TWSReleaseNotesView/UIImage%2BImageEffects.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"itemCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

NSDictionary *foodItem = [self.foodItems objectAtIndex:indexPath.row];

// Set up the image view
UIImageView *imageView = (UIImageView *)[cell viewWithTag:1];
UIImage *foodImage = [UIImage imageNamed:[foodItem objectForKey:FOOD_IMAGE_FILE_KEY]];
[imageView setImage:foodImage];
[imageView setContentMode:UIViewContentModeScaleAspectFill];

// Set up the label
UILabel *labelView = (UILabel *)[cell viewWithTag:2];
[labelView setFont:[UIFont flatFontOfSize:20.0]];
labelView.text = @"Blah";

// Set up the image view
UIImageView *blurredView = (UIImageView *)[cell viewWithTag:3];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    UIImage *blurredImage = [[self cropForBlur:foodImage] applyBlurWithRadius:4
                                                                tintColor:[UIColor colorWithWhite:1.0 alpha:0.2]
                                                    saturationDeltaFactor:1.2
                                                                maskImage:nil];

    dispatch_sync(dispatch_get_main_queue(), ^{
        blurredView.image = blurredImage;
    });
});

return cell;

}

*注意:我知道它很可能是模糊(而不是我的裁剪),因为它只会在我模糊时发生。此外,它与异步调度内容无关,因为如果我不这样做,它仍然会发生。

是的我正在使用ARC。是的我正在使用故事板。

这是cropForBlur:

- (UIImage *)cropForBlur:(UIImage *)originalImage
{
    CGSize size = [originalImage size];
    int startCroppingPosition = 100;
    if (size.height > size.width) {
        startCroppingPosition = size.height/2 + ((size.width / 320) * 45);
    } else {
        startCroppingPosition = size.height/2 + ((size.width / 320) * 45);
    }
    // WTF: Don't forget that the CGImageCreateWithImageInRect believes that
    // the image is 180 rotated, so x and y are inverted, same for height and width.
    CGRect cropRect = CGRectMake(0, startCroppingPosition, size.width, ((size.width/320) * 35));
    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], cropRect);
    UIImage *newImage = [UIImage imageWithCGImage:imageRef scale:(size.width/160) orientation:originalImage.imageOrientation];
    CGImageRelease(imageRef);
    return newImage;
}

我也尝试过使用乐器,但它会显示我总共使用了大量的内存但是大块的内存并没有出现在故障中。怪异。

这就是说我在左栏中使用了大量内存。 enter image description here

这是Instruments中的分配位。我不知道他们怎么能匹配。我没有僵尸或任何东西(除非在编辑方案中有其他地方改变它)。 enter image description here

这是在向下滚动一点后泄漏仪器视图。似乎没有显示任何真正的泄漏:S很混乱。 enter image description here

1 个答案:

答案 0 :(得分:0)

请参阅此link的解决方案。问题是图像与屏幕比例的比例不同。最终的输出图像可能非常大。