我从网络服务获得了一个大型(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
支持的所有文件类型呢?