内存泄漏仅在ios 10.x设备上发生,但在ios 9.3上很好

时间:2017-03-22 12:53:09

标签: xamarin memory-leaks xamarin.ios nsdata mupdf

我创建了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) - 它不会受到内存泄漏的影响。

1 个答案:

答案 0 :(得分:0)

遗憾的是,

Activity Monitor对于测量内存泄漏没有帮助。

检查内存泄漏的唯一方法是使用Instruments中的“Leaks”工具。这也会告诉你究竟哪些物品被泄露了

我的第一个怀疑是你只是看到某种缓存,如果内存不足,iOS会自由缓存 - 如果是这样的话,就没有泄漏。