将大图像/文件加载到UIWebView上 - 内存管理问题

时间:2015-04-30 15:21:17

标签: ios image memory-management uiwebview xamarin.ios

我从网络服务获得了一个大型(3900x2613像素)base64编码的JPEG图像。我解码它并将其呈现在UIWebView上。现在我得到

  

收到内存警告。

在我的示例应用中,真正的应用从iOS中被杀死。这就是我的工作:

webView = new UIWebView();
webView.TranslatesAutoresizingMaskIntoConstraints = false;
webView.ScalesPageToFit = true;
View.AddSubview(webView);
NSMutableDictionary viewsDictionary = new NSMutableDictionary();
viewsDictionary["webView"] = webView;
View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[webView]|", (NSLayoutFormatOptions)0, null, viewsDictionary));
View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[webView]|", (NSLayoutFormatOptions)0, null, viewsDictionary));

string image = System.IO.File.ReadAllText("big_image.txt"); // 11,8 MB encoded (origin image 8,9 MB)
double image_size = (double)(image.Length * sizeof (Char)) / 1024 / 1024;
Console.WriteLine("base64 encoded image size: " + Math.Round(image_size, 2) + " MB"); // 22,59 MB
NSData documentData = new NSData(image, NSDataBase64DecodingOptions.None);
Console.WriteLine("documentData size: " + NSByteCountFormatter.Format((long)documentData.Length, NSByteCountFormatterCountStyle.File)); // 8,9 MB

webView.LoadData(documentData, "image/jpeg", "", new NSUrl("/"));

我正在使用Xamarin.iOS,这段代码在C#中,但它应该只展示我的工作,你当然可以在你的答案中使用Objective-C / Swift。所以这不应该仅限于Xamarin.iOS,而应该局限于iOS。

现在我使用了乐器,这里有一些统计数据:

100 MB (Activity Monitor - Real memory usage of my app)  
21 MB (Leaks - Persistent Bytes)  

泄漏/分配中我还看到一个很大的Malloc

8,48 MB Foundation - NSData initWithBase64EncodedObject  
8,48 MB JavaScriptCore - WTF::fastMalloc(unsigned long)  

显示图像,但使用此方法缩放不正确(但这不是此处提出的问题)。所以在我的小样本应用程序中,我几乎达到了iPhone 4S的极限。真正的应用程序崩溃。 Safari可以毫无问题地打开图像。

我有什么选择?如果文件大小太大,应该怎么做?如果不仅仅涉及图像,而是UIWebView支持的所有文件类型呢?

0 个答案:

没有答案