gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:44:12 24 4
gpt4 key购买 nike

我正在使用以下方法调整 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;
}

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

- (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;
}

但是当我通过配置文件检查泄漏时,仪器显示泄漏像 Leak shown in Instruments

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

最佳答案

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

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

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

如果您出于任何原因不想缓存图像,您应该使用另一种创建它们的方法,例如,-imageWithContentsOfFile:不缓存图像。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com