应用程序在iOS 4.0上使用大图像时崩溃

时间:2010-09-09 18:28:57

标签: iphone image memory crash uiimage

我一直有问题在滚动视图上显示大图像,图像是2,4 - 4,7 MB。它在3GS和模拟器上运行良好。但每当我尝试在3G或iPod Touch 2G上运行时,它都会崩溃。

我在网上搜索并发现“imageNamed is evil”一文。好吧我把我所有的图像调用都改为imageWithContentsOfFile:但是它仍然崩溃了,我看到的唯一不同就是现在图像在我离开视图后被解除分配。但内存使用率仍然非常高。

这是Instruments的屏幕截图。 alt text 第一个峰值是我在启动时显示的视频,然后tableview显示了很多图像,直到那时没有任何问题。

alt text 当我输入1,1mb - 2576 x 1000张图片

alt text 当我输入4,8mb - 7822 x 1000张照片时

顺便说一下,应用程序在iOS 4和3.1.2上进行了测试

你有什么提示吗?因为这个问题让我疯了。

现在非常感谢!

3 个答案:

答案 0 :(得分:4)

我最近在测试3G上的应用时遇到了同样的问题。我最终缩小了大于最大像素数的任何图像(我发现我的3G上有200万像素似乎可靠地工作,但hotpaw2的答案似乎表明100万像素可能是一个更安全的赌注。)

UIImage *image = // ...;
if (image.size.width * image.size.height > MAX_PIXELS) {
    // calculate the scaling factor that will reduce the image size to MAX_PIXELS
    float actualHeight = image.size.height;
    float actualWidth = image.size.width;
    float scale = sqrt(image.size.width * image.size.height / MAX_PIXELS);

    // resize the image
    CGRect rect = CGRectMake(0.0, 0.0, floorf(actualWidth / scale), floorf(actualHeight / scale));
    UIGraphicsBeginImageContext(rect.size);
    [image drawInRect:rect];
    UIImage *imageToDraw = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // imageToDraw is a scaled version of image that preserves the aspect ratio
}

Apple还提供了一个开发照片库应用程序的示例,该应用程序使用CATiledLayer来平铺非常大的图像。他们的示例使用已预先切成适当大小的瓷砖的图像。可以在iOS应用程序中动态地将图像切割成图块,但在设备上这样做很慢。查看今年WWDC的104会议,了解PhotoScroller示例。

答案 1 :(得分:2)

iPhone 3G和iPod Touch 1G / 2G中的GPU仅有1k×1k纹理空间,似乎也可用于2D图像渲染。任何更大的东西都需要平铺以适合硬件图形渲染器。

3GS和更新版本拥有不同的GPU,可以支持更大的纹理,从而支持图像。

答案 2 :(得分:0)

我最终使用UIWebView,我不得不使用较小的(以MB为单位,而不是尺寸)图像,但它正在处理,唯一的问题是我无法缩放...使用scalePageToFit我可以缩放但图像适合横向不垂直,即sux。

我会尝试更新此问题。

如果有人遇到这个问题,我建议使用webview或适用于版本更高的三维图像查看器版本。