2014-12-19 4 views
5

Я борюсь с методом экспорта pdf, который работает очень хорошо, пока я не портировал приложение в архитектуру arm64.UIGraphicsBeginPDFPage() случайно сбой на 64-битных устройствах (CGPDFSecurityManagerCreateDecryptor())

Bacisally, метод открывает существующий PDF-файл, он создает новый pdf-файл и рисует содержимое первого pdf-файла во вновь созданный, прежде чем добавлять дополнительные страницы контента.

Когда метод пытается создать новую PDF-страницу для документа (после того, как первый PDF был интегрирован в новый pdf), приложение вылетает с предупреждением EXC_BAD_ACCESS в UIGraphicsBeginPDFPage(); вызов .

Это происходит только с некоторыми файлами 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() 

Если у вас есть какие-либо идеи об этом крушении, ваша помощь будет принята с благодарностью, был один день, пытаясь все, чтобы исправить это и beggening удивляться, если это не UIKit ошибка ...

Благодарности

+0

Я вижу тот же самый крах в той же функции, но с другой трассировкой стека. Хотя я не писал соответствующее программное обеспечение, я могу проверить, что он тоже работает с документами PDF и работает на OS X 10.10, поэтому его 64-битный – HairOfTheDog

ответ

1

я имел аварию на методе CGPDFSecurityManagerCreateDecryptor на 64-устройств только с помощью следующего кода:

CGPDFDocumentRelease(pdf); 
CGDataProviderRelease(provider); 
UIGraphicsEndPDFContext(); 

CGPDFSecurityManagerCreateDecryptor Wo uld вызывается при завершении контекста. Крушение ушло, когда я закончил контекст, прежде чем освободить документ и поставщика.

UIGraphicsEndPDFContext(); 
CGPDFDocumentRelease(pdf); 
CGDataProviderRelease(provider); 
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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^