在特定数量的循环迭代后,UIImageView停止显示图像

时间:2014-07-25 19:56:26

标签: ios objective-c cocoa-touch uiimage

我的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)];在应用程序的所有图像管理中使用大部分内存。

为什么我的应用只显示一定数量的图片?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

尝试按网址从应用包中加载完整尺寸的图片。例如:

@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];
}