• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 06:01:35 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

- (UIImage *)resizeImageUIImage *)image toSizeCGSize)newSize forNameNSString *)name {
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [_dictSmallImages setObject:newImage forKey:name];
    return newImage;
}

UITableViewcellForRowAtIndexPath 方法中,我是这样使用它的

- (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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

谁能告诉我为什么会出现这种泄漏??



Best Answer-推荐答案


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

  1. -imageNamed: 返回一个自动发布的图像,该图像将在未来的某个时间自动发布。
  2. -imageNamed 还会缓存它返回的图像。缓存正在保留图像。

如果您不释放它,缓存将继续保留图像,直到它释放它,例如发生内存警告时。因此,当您使用 imageNamed 获取图像时,它不会被释放,直到缓存被清除。

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

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

关于ios - 在弧中调整 UIImage 大小时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21326844/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap