CGPDFDocument 和 CGPDFPage 的 MonoTouch CoreGraphics PDF 内存问题

2024-02-03

我已经使用 MonoTouch 3 周了,一切都很顺利,直到我必须在我的应用程序中显示 PDF。

使用苹果的Quartz 2D 编程指南 http://developer.apple.com/mac/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_pdf/dq_pdf.html#//apple_ref/doc/uid/TP30001066-CH214-TPXREF109我成功地显示了 PDF。

问题是,该应用程序内存不足。我尝试在 CGPDFDocument 和 CGPDFPage 对象上使用 Dispose() 方法,但随后出现此错误:

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

这慢慢让我发疯,因为我尝试了我能想到的一切。

在 Apple 的示例中,有 CGPDFDocumentRelease 和 CGPDFPageRelease,但 MonoTouch 中缺少这些。因此我认为 MT 会自动管理这些对象,但显然它不会,或者它有问题。

即使我不干扰 CGPDF 对象的 Dispose(),当我从超级视图中删除包含 PDF 的视图时,也会发生上述错误。

有人能够在 MonoTouch 中处理 PDF 吗?

提前致谢。

UPDATE:
我用相同的 PDF 在 Obj-C 中测试了 PDF 绘图,发现当我不调用 CGPDFDocumentRelease() 时,内存消耗与 MonoTouch 中一样有快速上升的趋势。通过调用Obj-C中的CGPDFDocumentRelease(),内存消耗是正常的。
因此,我认为 MonoTouch 确实不会释放 CGPDFDocument 和 CGPDFPage 对象,当我尝试手动或间接释放它们(通过删除包含它们的视图)时,我收到上述错误。

这真是太糟糕了,现在我确实有可能必须用 Obj-C 重写代码……F$#k!!

另一个更新:
我仍然无法解释为什么会出现与发布相关的错误,但我制作了一个 MonoTouch 和一个 XCode 项目,两者本质上都做相同的事情:绘制 PDF。
我在 Activity Monitor 中比较了两者的内存使用情况,发现虽然 MonoTouch 应用程序不断增加内存使用量,但 XCode 应用程序却没有。我什至在 MonoTouch 中的 CGPDFDocument 对象上调用 Dispose(),但内存消耗仍然增加。
两个应用程序都没有因与发布相关的错误而崩溃,但确实令人担忧的是 MonoTouch 应用程序中的内存使用量如此之大......

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

另一个更新:
在视图的Draw()方法中绘制pdf的代码:

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();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CGPDFDocument 和 CGPDFPage 的 MonoTouch CoreGraphics PDF 内存问题 的相关文章

随机推荐

  • EMR 和 S3 上的 Delta Lake (OSS) 表 - Vacuum 需要很长时间且没有作业

    我正在使用开源版本将大量数据写入 Databricks Delta Lake 在 AWS EMR 上运行 并以 S3 作为存储层 我正在使用 EMRFS 为了提高性能 我经常压缩和清理桌子 如下所示 spark read format de
  • 如何更改android溢出按钮上弹出菜单的位置?

    我只是想实现与 Gmail 应用程序中的弹出菜单相同的东西 固定在右上角的溢出按钮上 为此 我使用了与 Android 谷歌教程相同的代码Android 弹出菜单 http developer android com guide topic
  • 在 Magento 中显示客户属于哪个组

    我在 Magento 中设置了几个客户组 常规 启用采购订单 我想知道这是否很容易在客户的帐户区域中显示给客户 以便他们可以看到自己属于哪个组 也许 MagePsycho 从旧版本中得到它 但在 1 5 上你需要更改组模型 Check Cu
  • 收到错误:找不到 id 为“id”的列

    我试图用数据填充垫表 但收到错误 Could not find column with id id 当我尝试这样做时 这就是我在组件文件中完成的方法 export class ListAllTrucksComponent displayed
  • Android Spinner 错误:android.view.WindowManager$BadTokenException:无法添加窗口

    我想使用 String 或 ArrayList 设置微调器值 我已经在其他活动中完成了微调器 工作正常 在此活动中 选项卡活动组中的另一个选项卡活动 我的问题是将值设置为微调器 微调器显示正确 这意味着加载活动时 工作正常 但当我单击 微调
  • 有没有办法通过多个用户名获取用户[Keycloak Admin Rest API]

    我是这个 keycloak 用户管理的新手 基本上我想在用户名字段上使用 IN 条件来获取用户 很不幸的是 不行 请参阅 REST API 文档 https www keycloak org docs api 15 0 rest api i
  • 创建具有特定长度和宽度的二维数组[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 见标题 我基本上需要它来创建一个可以
  • 文本框输入,键盘禁用,条形码扫描仪保留

    我制作了一个带有文本框的 Windows 窗体应用程序 我将强制用户使用条形码扫描仪 因此应该禁用键盘输入 KeyPressed 事件不起作用 因为也禁用了来自条形码扫描仪的输入 我想也许我可以在 TextChanged 事件上设置一个计时
  • 将 Google 电子表格日期转换为 JS Date 对象?

    我一直在绕圈子 我有一个包含两个日期的电子表格 我需要找到两个日期之间经过的年数 即某人在给定日期的年龄 这是Excel 的 DATEDIF 的替代品 第一步是将 Google 的序列号转换为 JS Date 对象 但似乎没有 Date 构
  • 如何在 Selenium 2 中实现 wait_for_page_to_load ?

    我是自动化 Web 测试的新手 目前正在从旧的 Selenium RC 实现迁移到 Ruby 中的 Selenium 2 有没有办法在页面加载之前停止执行命令 类似于 wait for page to load 在 Selenium RC
  • 解锁 PHPExcel 上的所有单元格

    SOLVED 找到自己解决这个问题的正确方法 使用类似PHPExcel getDefaultStyle gt getProtection gt setLocked fals e 这很棒 首先 Excel默认的单元格保护设置是 锁定 可见 我
  • WCF 自动生成 WSDL

    我有这个服务定义 DataContract public class Test DataMember IsRequired true public TestArray array DataContract public class Test
  • 语义 Ui 菜单不起作用

    我正在尝试使用语义 ui 菜单 但我无法让它工作 即当我单击菜单中的项目时 活动状态没有改变 我在网上也没有找到任何例子 HTML div class ui grid div class one wide row div class ui
  • 如何通过脚本以编程方式确定已安装的 IE 版本

    我们有一个基于selenium grid的自动化测试集群 为了管理集群 我构建了一个 Rake Ruby 任务集合 可以启动 重新启动 ping 和停止节点 我正在多种浏览器 包括 IE6 IE7 和 IE8 上测试我们的应用程序 这意味着
  • 如何在javascript中调整Base64图像的大小

    我测试了这个包 https preview npmjs com package resize base64 https preview npmjs com package resize base64 它需要前端部分来制作Canvas元素 等
  • Relay 和 GraphQL 中的身份验证

    我一直在使用反应和中继开发一个应用程序 现在我一直致力于实现身份验证 我知道您可以通过 GraphQL 解析函数中提供的上下文将值传递给每个 graphql 请求 我更困惑的是要传递什么以及如何传递 使用 JSON Web 令牌 护照或其他
  • 有什么快速方法可以使用 pandas 获得时间序列数据的正确聚合输出?

    我用过Redfin房地产数据 其中记录了芝加哥地区每个地区多年来的每月房屋销售价格 我想先计算该城市的年平均房屋销售价格 同时我还想获得每个区域的年房屋销售价格变化 然后我想将每个区域的年销售价格变化与各自的年平均房屋销售价格进行比较在城市
  • 动态添加按钮到面板并获取其父 ID

    我创建了一个页面 为管理员提供了一种更改照片信息 例如标题 描述等 的方法 页面上的所有控件都是动态添加的 因为我有多个照片库 面板 gt 父级 button 标题文本框 描述文本框 在每个面板中 我都有一个按钮 单击该按钮会将更改后的信息
  • 32 位编译在 64 位 Ubuntu 16.04 上失败

    我有一个应用程序需要使用 glib 和第三方提供的 32 位库 当我在 32 位 Ubuntu 上编译时 应用程序构建并成功运行 但是 当我在 64 位 Ubuntu 上尝试相同的操作时 由于以下错误而无法构建 usr include gl
  • CGPDFDocument 和 CGPDFPage 的 MonoTouch CoreGraphics PDF 内存问题

    我已经使用 MonoTouch 3 周了 一切都很顺利 直到我必须在我的应用程序中显示 PDF 使用苹果的Quartz 2D 编程指南 http developer apple com mac library documentation G