在弧形中调整UIImage大小时内存泄漏

时间:2014-01-24 07:27:40

标签: ios iphone objective-c ipad uiimage

我正在使用以下方法调整 UIImages 的大小

- (UIImage *)resizeImage:(UIImage *)image toSize:(CGSize)newSize forName:(NSString *)name {
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [_dictSmallImages setObject:newImage forKey:name];
    return newImage;
}

UITableView cellForRowAtIndexPath 方法中我正在使用它

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

    [[cell.contentView viewWithTag:indexPath.row + 1] removeFromSuperview];

    // Configure the cell...
    NSString *imageName = [NSString stringWithFormat:@"img%d", indexPath.row + 1];
    CGRect imageRect = CGRectMake(8, 5, 304, 190);

    UIImage *scaledImage = [_dictSmallImages objectForKey:imageName];
    if (![_dictSmallImages objectForKey:imageName]) {
        scaledImage = [self resizeImage:[UIImage imageNamed:imageName] toSize:CGSizeMake(304, 190) forName:imageName];
    }

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:imageRect];
    [imgView setTag:indexPath.row + 1];
    [imgView setContentMode:UIViewContentModeScaleAspectFit];
    [imgView setImage:scaledImage];
    [cell.contentView addSubview:imgView];

    if ((lastIndexPath.row == 10 && indexPath.row == 0) || indexPath.row == lastIndexPath.row) {

        if (_delegate) {
            NSString *imgName = [NSString stringWithFormat:@"img%d", indexPath.row + 1];
            [_delegate selectedText:imgName];
        }

        [imgView.layer setBorderColor:[UIColor yellowColor].CGColor];
        [imgView.layer setBorderWidth:5.0f];
        [imgView setAlpha:1.0f];
        lastIndexPath = indexPath;
    }
    return cell;
}

但是当我通过Profile查看泄漏时,仪器会显示泄漏情况 Leak shown in Instruments

任何人都可以让我知道为什么会有这种泄漏?

1 个答案:

答案 0 :(得分:4)

关于-imageNamed:,您应该了解两个主要事实,特别是当您决定使用它时:

  1. -imageNamed:会返回一张自动释放的图片,该图片会在将来的某个时间自动发布。
  2. -imageNamed也会缓存它返回的图像。缓存保留图像。
  3. 如果您不释放它,缓存将继续保留图像,直到它释放它,例如发生内存警告时。因此,当您使用imageNamed获取图像时,它将不会被释放,直到清除缓存。

    如果您不希望因任何原因缓存图像,则应使用另一种创建图像的方法,例如,-imageWithContentsOfFile:不会缓存图像。

    您可以预期从-imageWithContentsOfFile:返回的图像对象是自动释放的而不是缓存的,并且它将在运行循环结束时释放。