【问题标题】:Help loading large Images in UIWebview?帮助在 UIWebview 中加载大图像?
【发布时间】:2011-07-05 15:55:20
【问题描述】:

我正在使用以下代码在 UIWebview 中加载图像。对于每个图像(在滚动我的滚动视图时),都会调用一个函数来加载图像。问题是当我连续滚动最多 30 张图像时,应用程序崩溃了。可能是什么原因?我的图像是 1300 x 1200 像素。请帮我找到解决方案。

- (void) loadCatalogImage 
{
    @try{
//  if(imgView.image != nil)
//      return;
    //  [global_imgProgress startAnimating];
    //NSLog(@"image loading at = %@, %d", baseURL, 2 + pageNo);
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];

    //NSArray *array = [global_ContentString componentsSeparatedByString:@"@@#"];
    NSArray *array1 = [catalogURL componentsSeparatedByString:@"&"];
    //NSLog(@"baseURL = %@",baseURL);
    NSLog(@"loading catalog image(method: loadCatalogImage).......%@%@",baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:0]); 

    zoomedImageURL = [NSString stringWithFormat:@"%@%@", baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:1]];
//  NSLog(@"Catalog ZOOM URL = %@", zoomedImageURL);//[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"]);//[[[array objectAtIndex:[[global_CatalogRef objectAtIndex:pageNo] intValue]] componentsSeparatedByString:@"##"] objectAtIndex:3]);
    [zoomedImageURL retain];

    NSLog(@"aaaaaaa = %@",zoomedImageURL);
    [webView loadRequest:
        [NSURLRequest requestWithURL:
            [NSURL URLWithString:
                [NSString stringWithFormat:@"%@%@",baseURL, [[[array1 objectAtIndex:0] componentsSeparatedByString:@"##"] objectAtIndex:1]
                ]
            ]]
        ];

    }
}

【问题讨论】:

  • 您在控制台上获得了哪些堆栈跟踪或崩溃信息?您的项目是否产生任何警告?
  • 仅供参考:您没有释放正在创建的池。
  • @Madhumitha:你的解决方案是什么?

标签: iphone ipad memory-management uiscrollview


【解决方案1】:

您的图片是 1300 x 1200 并且您正在加载其中的 30 张?您可能内存不足。如果您的应用程序忽略内存警告并占用内存,则 iOS 系统可能会强制您的应用程序退出。正如我在下面的评论中提到的那样,这么多尺寸的图像大约是 180 兆。太大了。

你真的需要将这么大的图像传送到一个 iphone 应用程序中吗?

【讨论】:

  • 图片大小是问题..?
  • 正如我所说,您可能内存不足。不能肯定地说,但它是一个可能的候选人!
  • 我再次问:“你真的需要将这么大的图像传送到一个 iphone 应用程序,以及这么多的应用程序吗?”。 iPhone有内存限制,你无法绕过!你需要妥协。 30 幅那样大小的图像是行不通的。如果你坚持拥有30张巨图,你会继续挣扎!
  • 内存大小有限制。我不知道如何比这更直接地说:计算机没有无限的内存。当您加载 1300x1200 的图像时,它可能会占用 1300x1200x4 字节的内存。那是大约6megs。 30x6 是 180 兆。这比你应该尝试在 iPhone 应用程序中使用的内存要多得多。一个好的经验法则是尽可能将内存保持在 20 兆以下。
  • 如果您正在加载巨大的图像,您可以不用加载一些,但尽快卸载不再需要的图像至关重要。否则,没有内存了,哎呀,它又崩溃了……
【解决方案2】:

你能放一个崩溃日志吗?如果可能,启用环境变量“NSZombieEnabled”,然后运行应用程序并查看崩溃日志。这将帮助我们找到确切的问题。顺便问一下,您为什么要创建和保留“zoomedImageURL”?

【讨论】:

  • 当它崩溃时,控制台会说“调试器已以状态 0 退出”。我在另一个地方使用 zoomedImageURL。所以我保留了它。
  • 控制台还有什么有趣的吗?比如“收到内存警告”之类的?
  • @occulus: 是的……我也一样。
  • 那你确实是内存不足了,加载30张大图也就不足为奇了。
  • 顺便说一句,每当您提出问题时,请始终将任何有趣的控制台输出作为问题的一部分。它可以节省每个人的时间。
【解决方案3】:

任何加载足够资源以占用如此多内存的应用都会崩溃。 Apple 有几个演示项目专门处理通过将大图像分解成更小的部分来加载大图像 ci 建议你看看它们。

【讨论】:

  • 你有例子吗?可以加个链接吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多