我正在努力使用pdf导出方法,该方法运行得很好,直到我将应用程序移植到arm64架构。
Bacisally,该方法打开一个现有的PDF,它创建一个新的pdf文件,并在添加更多内容页面之前将第一个pdf的内容绘制到新创建的文件中。
当方法尝试为文档创建新的pdf页面时(在第一个pdf集成到新的pdf之后),应用程序崩溃,并在UIGraphicsBeginPDFPage()上发出EXC_BAD_ACCESS警告;打电话。
仅在某些PDF文件中发生,而不是全部,仅在64位设备上发生。
这是显示CGPDFSecurityManagerCreateDecryptor()调用的堆栈跟踪,我无法找到它的作用。
Thread 14Queue : NSOperationQueue 0x14f6dd3a0 :: NSOperation 0x17504a470 (serial)
#0 0x00000001838aeee4 in CGPDFSecurityManagerCreateDecryptor ()
#1 0x00000001838d1004 in pdf_filter_chain_create ()
#2 0x0000000183831e00 in CGPDFStreamCreateFilterChain ()
#3 0x000000018383226c in chain_get_bytes ()
#4 0x0000000183b5e0ac in unpackImageRow ()
#5 0x0000000183b5dfd4 in PDFImageEmitData ()
#6 0x0000000183b5f684 in emit_image ()
#7 0x0000000183b5ef9c in PDFImageEmitDefinition ()
#8 0x0000000183464584 in __CFSetApplyFunction_block_invoke ()
#9 0x00000001834643bc in CFBasicHashApply ()
#10 0x00000001834642e4 in CFSetApplyFunction ()
#11 0x0000000183b5fa9c in PDFImageSetEmitDefinitions ()
#12 0x0000000183b590c0 in emit_page_resources(PDFDocument*) ()
#13 0x0000000183b5904c in PDFDocumentEndPage ()
#14 0x0000000183b57cf0 in pdf_EndPage ()
#15 0x0000000187fda904 in UIGraphicsBeginPDFPageWithInfo ()
#16 0x00000001002093e8 in -[ExportTools renderPdfContentToContext:forPlanVersion:]
#17 0x00000001001fba60 in -[ExportTools generatePdfReportWithOptions:]
#18 0x00000001000f7eb4 in -[DetailViewController generatePdfAndShowModalOpenWithAppWithOptions:]
#19 0x00000001835883c0 in __invoking___ ()
#20 0x0000000183486138 in -[NSInvocation invoke] ()
#21 0x000000018443ba20 in -[NSInvocationOperation main] ()
#22 0x000000018437c61c in -[__NSOperationInternal _start:] ()
#23 0x000000018443e26c in __NSOQSchedule_f ()
#24 0x000000010105cdf0 in _dispatch_client_callout ()
#25 0x0000000101067854 in _dispatch_queue_drain ()
#26 0x0000000101060120 in _dispatch_queue_invoke ()
#27 0x000000010106975c in _dispatch_root_queue_drain ()
#28 0x000000010106af18 in _dispatch_worker_thread3 ()
#29 0x00000001945012e4 in _pthread_wqthread ()
如果您对此次崩溃有任何了解,我们将非常感谢您的帮助,有一天会尝试一切来解决这个问题并且想知道这不是UIKit的错误...
由于
答案 0 :(得分:1)
我在64台设备上的CGPDFSecurityManagerCreateDecryptor方法崩溃时只使用以下代码:
CGPDFDocumentRelease(pdf);
CGDataProviderRelease(provider);
UIGraphicsEndPDFContext();
结束上下文时将调用CGPDFSecurityManagerCreateDecryptor。当我在发布文档和提供者之前结束上下文时,崩溃就消失了。
UIGraphicsEndPDFContext();
CGPDFDocumentRelease(pdf);
CGDataProviderRelease(provider);
答案 1 :(得分:0)
我也一直在努力解决同样的问题,虽然比尔的回答给了我线索,但我必须做一点点不同的事情。在我的情况下,有可变数量的源PDF被复制到目标PDF中,所以我不能简单地在UIGraphicsEndContext
之前移动CGPDFDocumentRelease
。代码结构看起来大致如下:
UIGraphicsBeginPDFContextToFile(...);
// ...
for each attachment pdf {
srcPdf = CGPDFDocumentCreateWithURL(...); // open source PDF
// ...
UIGraphicsBeginPDFPageWithInfo(...); // new page in target PDF, this randomly crashes
// ...
CGPDFDocumentRelease(srcPdf); // close source PDF
}
// ...
UIGraphicsEndPDFContext();
因此,我尝试捕获对其使用的所有源PDF的引用,并在完成目标PDF的其余部分之后将其全部释放,稍后在代码中。这是一种丑陋,因为它将责任移到远处,并将所有记忆保存到最后,而不是在每个渲染后释放...但它似乎确实有效!很难说明确的,因为它是一次随机的崩溃,但我从未见过它,而且我一直在努力让它再次发作。
pdfRefs = [[NSPointerArray alloc] init];
UIGraphicsBeginPDFContextToFile(...);
// ...
for each attachment pdf {
srcPdf = CGPDFDocumentCreateWithURL(...); // open source PDF
// ...
UIGraphicsBeginPDFPageWithInfo(...); // new page in target PDF, this randomly crashes
// ...
[pdfRefs addPointer:srcPdf]; // store for later closing
}
// ...
UIGraphicsEndPDFContext();
for each srcPdf in pdfRefs {
CGPDFDocumentRelease(srcPdf); // close it here
}