首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGPDFDocument和CGPDFPage的MonoTouch CoreGraphics PDF内存问题

CGPDFDocument和CGPDFPage的MonoTouch CoreGraphics PDF内存问题
EN

Stack Overflow用户
提问于 2010-02-18 22:14:33
回答 2查看 2.4K关注 0票数 1

我使用MonoTouch已经3周了,在我不得不在我的应用程序中显示PDF之前,一切都很好。

使用苹果的Quartz 2D Programming Guide,我成功地显示了这个文件。

问题是,应用程序耗尽了内存。我尝试在CGPDFDocument和CGPDFPage对象上使用Dispose()方法,但随后收到以下错误:

代码语言:javascript
复制
Stacktrace:

  at (wrapper managed-to-native) MonoTouch.CoreGraphics.CGPDFPage.CGPDFPageRelease (intptr) <0xffffffff>
  at MonoTouch.CoreGraphics.CGPDFPage.Dispose (bool) <0x00044>
  at MonoTouch.CoreGraphics.CGPDFPage.Finalize () <0x0002b>
  at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) <0x0007b>

Native stacktrace:

0   FlapMag1                            0x00037514 mono_handle_native_sigsegv + 412
1   FlapMag1                            0x0000c010 mono_sigsegv_signal_handler + 348
2   libSystem.B.dylib                   0x339927f3 _sigtramp + 34
3   libCGVolute.A.dylib                 0x31c83d88 CPModelRelease + 24
4   libCGVolute.A.dylib                 0x31c84ad4 model_release + 56
5   CoreGraphics                        0x3113ced8 pdf_page_finalize + 68
6   CoreFoundation                      0x3388fae9 _CFRelease + 168
7   CoreFoundation                      0x3388f9c7 CFRelease + 66
8   CoreGraphics                        0x3113ce90 CGPDFPageRelease + 20
9   FlapMag1                            0x00248cc0 wrapper_managed_to_native_MonoTouch_CoreGraphics_CGPDFPage_CGPDFPageRelease_intptr + 64
* Assertion: should not be reached at ../../../../mono/mini/mini-darwin.c:258

这慢慢地让我发疯,因为我试过了我能想到的所有方法。

在苹果的例子中,有CGPDFDocumentRelease和CGPDFPageRelease,但MonoTouch没有这两款手机。因此,我认为MT会自动管理这些对象,但显然它不是这样做的,或者它有but。

即使我没有处理CGPDF对象的Dispose(),当我从superview中删除包含PDF的视图时,也会出现上述错误。

是否有人能够在MonoTouch中处理PDF?

提前谢谢。

更新:

我在Obj-C中用相同的PDF测试了PDF绘图,发现当我不调用CGPDFDocumentRelease()时,内存消耗与在MonoTouch中一样有快速上升的趋势。通过调用Obj-C中的CGPDFDocumentRelease(),内存消耗是正常的。

因此,我认为MonoTouch实际上并没有释放CGPDFDocument和CGPDFPage对象,当我试图手动或间接地释放它们(通过删除包含它们的视图)时,我得到了上面的错误。

这很糟糕,现在很有可能,我必须用Obj-C重写代码……F$#k!!

另一个更新:

我仍然不能解释为什么我会得到与发布相关的错误,但我做了一个MonoTouch和一个XCode项目,这两个项目本质上做的是相同的事情:绘制PDF。

我在活动监视器中比较了两者的内存使用率,发现虽然MonoTouch应用程序不断增加内存使用量,但XCode应用程序不会。我甚至在MonoTouch中调用了CGPDFDocument对象上的Dispose(),但内存消耗仍然增加。

这两个应用程序都没有因为发布相关的错误而崩溃,但令人担忧的是,MonoTouch应用程序中的内存使用量如此之大……

我认为我的问题出在别的地方,但我之所以来到这里,是因为我的主应用程序在内存消耗过高后崩溃了,而我似乎找不到一种方法来降低它,因为我收到了这些恼人的发布错误。

还有另一个更新:

在视图的Draw()方法中绘制pdf的代码:

代码语言:javascript
复制
CGContext context = UIGraphics.GetCurrentContext();

context.SaveState();

CGPDFDocument pdfDoc = CGPDFDocument.FromUrl(_pdfFileUrl);
if(pdfDoc.Pages >= 1)
{
    CGPDFPage pdfPage = pdfDoc.GetPage(1);  

    context.ScaleCTM(SCALE.Width, SCALE.Height);
    // the PDFRectangle is the media box rect of the page, which is hardcoded
    // for now
    context.TranslateCTM(-this.PDFRectangle.X, -this.PDFRectangle.Height - this.PDFRectangle.Y);

    context.DrawPDFPage(pdfPage);
}

pdfDoc.Dispose();

context.RestoreState();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-23 00:52:28

这是由MonoTouch Alpha中的错误引起的,该错误将在版本1.9.3中修复

票数 3
EN

Stack Overflow用户

发布于 2010-02-19 05:57:15

上面的堆栈跟踪显示PDF发布代码是从终结器线程调用的,而不是直接从Dispose调用的。

您能为我提供一个测试用例来展示这个问题吗?一旦我们有了测试用例,我们应该能够在几个小时内为您提供修复或解决方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2289174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档