2014-12-19 12 views
5

저는 앱을 arm64 아키텍처로 이식하기 전까지는 잘 실행되는 PDF 내보내기 메소드로 고민하고 있습니다.64bit 디바이스에서 UIGraphicsBeginPDFPage()가 무작위로 충돌합니다 (CGPDFSecurityManagerCreateDecryptor())

방법은 기존 PDF를 열고 새로운 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 버그가 아니라면 궁금 beggening하고,

감사

을 감상 할 수있다

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

CGPDFSecurityManagerCreateDecryptor 호 :

+0

동일한 기능에서 같은 스택 크래시가 발생합니다. 문제의 소프트웨어를 작성하지는 않았지만 PDF 문서 작업을하고 OS X 10.10에서 실행 중임을 확인할 수 있으므로 64 비트 – HairOfTheDog

답변

1

나는 단지 다음 코드를 사용하여 64 장치에 CGPDFSecurityManagerCreateDecryptor 방법에 충돌했다 문맥을 종료 할 때 uld가 호출됩니다. 문서 및 제공자를 릴리스하기 전에 컨텍스트를 종료했을 때 충돌이 사라졌습니다.

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

나는이 똑같은 문제에 너무 어려움을 겪었으며, 빌의 대답은 나에게 조금 다른 방식으로 해 주어야했다. 내 상황에는 대상 PDF로 복사되는 소스 PDF가 다양하므로 CGPDFDocumentRelease 전에 UIGraphicsEndContext을 단순히 움직일 수는 없습니다. 코드 구조는 다음과 거의 같습니다

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 
}