【问题标题】:UIImageView stops displaying images after a specific amount of loop iterationsUIImageView 在特定数量的循环迭代后停止显示图像
【发布时间】:2014-07-25 19:56:26
【问题描述】:

我的 iOS 应用使用循环来循环浏览文件夹中的图像。 我的应用程序应该循环遍历文件夹内的总共 2031 张图像(大小为 1200x900)。图像以 8fps 的速度拍摄,每张图像都将在循环继续模拟视频剪辑时显示。在第 696 张图片之后,图像将停止在 UIImageView 中显示,尽管应用会继续循环。

我测试了一下是不是因为图片不存在导致断开了 我从图片 200 开始循环,但在图片 896 之后 UIImageView 停止显示图片。

代码:

imgName = [NSString stringWithFormat:@"subject_basline_mat k (%d).png",jojo];
jojo++;
imageToCrop.image = [UIImage imageNamed:imgName]; //imageToCrop is the name of the UIImageView image and it is set to the image file here
imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size]; //Here the image is converted to fit the bounds of the simulator which is 320x240

代码循环是由于一个计时器大约每 0.8 秒循环一次。

我用仪器运行我的代码以查看是否出现内存问题,并且仪器在我的计算机上非常重。因此,我的应用程序运行得很慢。但是,当我到达第 696 张图片时,这些图片一直在显示自己。就好像我的应用程序运行得太快导致图片无法显示......我不太明白。

图像切换中唯一占用大量内存的部分似乎是尺寸转换步骤,该步骤由以下行调用 imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size];

imageToCrop.image = [self imageWithImage:imageToCrop.image convertToSize:self.imageToCrop.frame.size];

“imageWithImage”方法在这里:

- (UIImage *)imageWithImage:(UIImage *)image convertToSize:(CGSize)size {
@autoreleasepool {
    UIGraphicsBeginImageContext(size);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *destImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return destImage;
}

还有线 [image drawInRect:CGRectMake(0, 0, size.width, size.height)];在应用程序中的所有图像管理中使用了最多的内存。

关于为什么我的应用只会显示一定数量的图像有什么想法吗?

【问题讨论】:

  • 如果您对该问题投反对票,请告诉我原因,以便我可以改进问题或不再发布此类问题。谢谢!
  • R u 使用 ARC 并确保没有内存泄漏?
  • 是的,我正在使用 ARC,据我在使用仪器时所见,没有内存泄漏。
  • 您是否尝试过调整0.8 的第二个延迟以查看它是否会改变将显示的图像数量?这可能有助于缩小问题范围。
  • 是的。我试过了,我的程序运行得越慢,显示的图片就越多。但是,出于我工作的目的,应用程序需要快速运行。所以,我不确定为什么一个较慢的程序在加载图片方面会比一个快速的程序做得更好。

标签: ios objective-c cocoa-touch uiimage


【解决方案1】:

尝试通过 URL 从应用程序包中加载全尺寸图像。例如:

@autoreleasepool {
    NSString *imgName = [NSString stringWithFormat:@"subject_basline_mat k (%d)",jojo];
    NSURL *imageURL = [[NSBundle mainBundle] URLForResource:imgName withExtension:@"png"];
    UIImage *image = [UIImage imageWithContentsOfFile:[imageURL path]];
    imageToCrop.image = [self imageWithImage:image convertToSize:self.imageToCrop.frame.size];
}

【讨论】:

  • 是的,成功了!不知道我这样做的方式会缓存图像。
【解决方案2】:

几乎可以肯定你的问题是[UIImage imageNamed:imgName]。这里有数百篇关于使用它的陷阱的帖子。问题是它缓存了图像——它的真正目的是为你的包中的少量图像。

如果您有大量图像,请获取图像的路径,然后通过 URL 或文件指针获取图像。这样它就不会被缓存。请注意,执行此操作时,您会丢失自动“get-retina-image-automatically”,因此您需要根据设备是否为视网膜来获取适当大小的图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多