我创建了an example project来重现问题(克隆并运行就绪)。 输入pdf文件需要什么项目,并为每个页面创建缩略图。在实际项目中,工作线程遍历许多页面(约100页)的pdf文件。
对我来说很奇怪的是,在ios 9.3(13E233,iPad Air模拟器)上没有内存泄漏。测试方法完成后,活动监视器显示使用的内存为48.4mb。但ios 10.x(14C89,114345)模拟器的内存高达782.7 mb!内存泄漏也发生在真实设备上 - 使用ios 10.2.1(14D27)的ipad air。
每个pdf页面都通过以下方法处理:
CGSize SaveThumbnailGetSize (PDFDocument pdfDocument, int pdfPage, string filename)
{
CGSize size = pdfDocument.GetPageSize (pdfPage);
nfloat K = 750f / size.Width < 1 ? 750f / size.Width : 1;
MuPDFLib.Cookie cookie = new MuPDFLib.Cookie ();
using (NativeBitmap img = pdfDocument.RenderToBitmap (PDFDocument.context, new CGRect (0, 0, (int)Math.Round (size.Width * K), (int)Math.Round (size.Height * K)), K, pdfPage, 0, ref cookie)) {
NSError err = null;
using (var uimg = ((UIImage)img)) {
// Memory leak occurs only with this line. If comment this, memory leak will no occur.
using (NSData data = uimg.AsJPEG (0.4f)) {
//[optional line]
//data.Save (filename, true, out err);
}
}
if (err != null) {
Console.WriteLine ("Could not save thumbnail: {0}", err);
}
}
return size;
}
我认为这一行出现了错误:
NSData data = uimg.AsJPEG (0.4f)
此外,我试图用NSAutoreleasePool包围方法/使用/代码块,但没有成功(但我想xamarin应该自动完成)。
一些系统信息:
Xamarin Studio Community Version 6.2(build 1829)
Apple Developer Tools Xcode 8.2.1(11766.1)Build 8C1002
Xamarin.iOS 版本:10.4.0.128(Xamarin Studio Community) 哈希:ba11e48 分支:cycle9 建设日期:2017-03-10 08:48:04-0500
操作系统 Mac OS X 10.12.3
UPD(04.04.2017): 创建了一个错误报告: https://bugzilla.xamarin.com/show_bug.cgi?id=54443
在升级xamarin之后,xcode和os得到了新的iOS系统 - 10.3(14E269) - 它不会受到内存泄漏的影响。
答案 0 :(得分:0)
Activity Monitor对于测量内存泄漏没有帮助。
检查内存泄漏的唯一方法是使用Instruments中的“Leaks”工具。这也会告诉你究竟哪些物品被泄露了
我的第一个怀疑是你只是看到某种缓存,如果内存不足,iOS会自由缓存 - 如果是这样的话,就没有泄漏。