CGContextDrawPDFPage bater sem nunca produzir uma memória aviso
-
14-11-2019 - |
Pergunta
Eu estou tentando compor uma página PDF com algumas anotações sobre o mesmo (e-mail), e na maioria das vezes isso funciona bem.
No entanto, com este PDF em particular, parece que falha sempre na chamada para CGContextDrawPDFPage para a primeira página.Eu adicionei
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
como uma recomendação de CGContextDrawPDFPage tomando grandes quantidades de memória mas que não parecem resolver o meu problema.
Eu corri isso através do profiler para ver o que estava acontecendo, e ele lentamente começou a atribuição de um monte de memória, até que finalmente ele atingiu 512MB de viver bytes e morreu.
O estranho é que quando eu processamento de uma imagem (para visualização no dispositivo) contexto parece funcionar bem, mas quando eu processá-lo para um PDF contexto (por e-mail com anotações), ele quebra.Todos os outros PDFs eu tentei trabalhar bem, em ambos os casos.
Eu estava esperando que alguém que está escrito um visualizador de PDF/anotador poderia testar isso e ver se este documento funciona para eles, e se assim for, me dê algumas dicas sobre o que eles estão fazendo para reduzir as alocações de memória de CGContextDrawPDFPage.
Outro recurso que eu olhei foi esse grande ENTÃO, Pergunta.
Editar (para mais informações sobre a falha):
90% do tempo do acidente, na verdade, não comparecer, a gdb linha apresenta, mas o aplicativo vai embora e o rastreamento de pilha não mostrar.(Ele diz pausa, mas não há exibição de tópicos).Uma vez eu vi que era um exc_bad_access e ele mostrou isso no log:
malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Solução
Você está construindo o PDF no thread principal?Se assim for, você não pode receber o aviso de memória, porque você já bloqueou o sinal enquanto estiver em execução, uma vez que a execução do loop nunca tem uma chance para a mensagem de envio para você.
Outras dicas
Remover a exceção de ponto de interrupção no xcode e ele funciona muito bem.