2014-12-19 13 views
5

Ich habe Probleme mit einem PDF-Export-Methode, die lief gut, bis ich die App auf die Arm64 Architektur übertragen.UIGraphicsBeginPDFPage() stürzt zufällig auf 64-Bit-Geräten (CGPDFSecurityManagerCreateDecryptor())

Bacisally öffnet die Methode eine vorhandene PDF, erstellt eine neue PDF-Datei und zeichnet den Inhalt der ersten PDF in den neu erstellten, bevor Sie weitere Inhaltsseiten hinzufügen.

Wenn die Methode versucht, eine neue PDF-Seite zum Dokument zu erstellen (nachdem die erste PDF in die neue PDF integriert wurde), stürzt die App mit einer EXC_BAD_ACCESS Warnung auf UIGraphicsBeginPDFPage() ab; Anruf .

Es passiert nur mit einigen PDF-Dateien, nicht alle und nur auf 64-Bit-Geräten.

Hier ist die Stacktrace, die den Aufruf CGPDFSecurityManagerCreateDecryptor() zeigt, die ich nicht finden konnte, was es tut.

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

Wenn Sie eine Idee zu diesem Absturz haben, würde Ihre Hilfe sehr zu schätzen, ist ein Tag alles versucht, dieses Problem zu beheben und beggening zu fragen, ob es nicht ein UIKit Fehler ist ...

Dank

+0

Ich sehe den gleichen Absturz in der gleichen Funktion, aber mit einem anderen Stack-Trace. Obwohl ich die fragliche Software nicht geschrieben habe, kann ich bestätigen, dass sie auch mit PDF-Dokumenten arbeitet und auf OS X 10.10 läuft, also ihre 64-Bit-Version – HairOfTheDog

Antwort

1

hatte ich einen Crash auf der CGPDFSecurityManagerCreateDecryptor Methode auf 64-Geräten nur mit dem folgenden Code:

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

CGPDFSecurityManagerCreateDecryptor wo Wird beim Beenden des Kontexts aufgerufen. Der Absturz ist vorbei, als ich den Kontext beendet habe, BEVOR ich das Dokument und den Provider freigegeben habe.

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

Ich habe mit diesem gleichen Problem auch gekämpft, und während Bills Antwort mir den Schlüssel gab, musste ich es ein bisschen anders machen. In meiner Situation gibt es eine variable Anzahl von Quell-PDFs, die in das Ziel-PDF kopiert werden, so dass ich nicht einfach UIGraphicsEndContext vor CGPDFDocumentRelease verschieben kann. Die Codestruktur sieht ungefähr wie folgt aus:

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

Anstatt also habe ich versucht, die Verweise auf alle Quell PDFs erfassen sie verwendet und sie alle nach dem Rest des Ziel PDF erfolgt, viel später im Code freigibt. Dies ist eine Art hässlich, weil es die Verantwortung weit weg bewegt und die gesamte Erinnerung bis zum Ende enthält, anstatt es zu veröffentlichen, nachdem jeder gerendert wurde ... ABER es scheint zu funktionieren! Es ist schwer, definitiv zu sagen, da es ein zufälliger Absturz war, aber ich habe es seitdem nicht mehr gesehen und ich habe es sehr oft gehämmert, um es wieder zu bekommen.

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 
}