Я работаю с MonoTouch уже 3 недели, и все шло отлично, пока мне не пришлось отображать PDF-файлы в своем приложении.
Используя Руководство по программированию Quartz 2D Мне удалось отобразить PDF.
Проблема в том, что приложению не хватает памяти. Я пытался использовать методы Dispose() для объектов CGPDFDocument и CGPDFPage, но затем получаю эту ошибку:
Stacktrace:
at (wrapper managed-to-native) MonoTouch.CoreGraphics.CGPDFPage.CGPDFPageRelease (intptr) <0xffffffff>
at MonoTouch.CoreGraphics.CGPDFPage.Dispose (bool) <0x00044>
at MonoTouch.CoreGraphics.CGPDFPage.Finalize () <0x0002b>
at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) <0x0007b>
Native stacktrace:
0 FlapMag1 0x00037514 mono_handle_native_sigsegv + 412
1 FlapMag1 0x0000c010 mono_sigsegv_signal_handler + 348
2 libSystem.B.dylib 0x339927f3 _sigtramp + 34
3 libCGVolute.A.dylib 0x31c83d88 CPModelRelease + 24
4 libCGVolute.A.dylib 0x31c84ad4 model_release + 56
5 CoreGraphics 0x3113ced8 pdf_page_finalize + 68
6 CoreFoundation 0x3388fae9 _CFRelease + 168
7 CoreFoundation 0x3388f9c7 CFRelease + 66
8 CoreGraphics 0x3113ce90 CGPDFPageRelease + 20
9 FlapMag1 0x00248cc0 wrapper_managed_to_native_MonoTouch_CoreGraphics_CGPDFPage_CGPDFPageRelease_intptr + 64
* Assertion: should not be reached at ../../../../mono/mini/mini-darwin.c:258
Это медленно сводит меня с ума, потому что я перепробовал все, что мог придумать.
В примере Apple есть CGPDFDocumentRelease и CGPDFPageRelease, но они отсутствуют в MonoTouch. Поэтому я думал, что MT управляет этими объектами автоматически, но, видимо, это не так или он глючит.
Даже когда я не связываюсь с Dispose() объекта CGPDF, возникает вышеуказанная ошибка, когда я удаляю представление, содержащее PDF, из суперпредставления.
Кто-нибудь смог работать с PDF-файлами в MonoTouch?
Заранее спасибо.
ОБНОВЛЕНИЕ:
Я протестировал рисование PDF в Obj-C с теми же PDF-файлами и обнаружил, что когда я не вызываю CGPDFDocumentRelease(), потребление памяти имеет такую же тенденцию к быстрому увеличению, как и в MonoTouch. При вызове CGPDFDocumentRelease() в Obj-C потребление памяти является нормальным.
Поэтому я думаю, что MonoTouch действительно не освобождает объекты CGPDFDocument и CGPDFPage, и когда я пытаюсь освободить их вручную или косвенно (путем удаления представлений которые содержат их), я получаю вышеуказанную ошибку.
Это полный отстой, и сейчас вполне возможно, что мне придется переписать код в Obj-C... F$#k!!
ДРУГОЕ ОБНОВЛЕНИЕ:
Я до сих пор не могу понять, почему я получаю ошибки, связанные с выпуском, но я сделал проект MonoTouch и XCode, где оба делают одно и то же: рисуют PDF-файлы.
Я сравнил память. использование обоих в мониторе активности и обнаружил, что, хотя приложение MonoTouch постоянно увеличивает использование памяти, приложение XCode этого не делает. Я даже вызываю Dispose() для объекта CGPDFDocument в MonoTouch, но потребление памяти все равно увеличивается.
Ни одно из приложений не вылетает из-за ошибки, связанной с выпуском, но действительно беспокоит то, что использование памяти в приложении MonoTouch значительно больше. .
Я полагаю, что моя проблема заключается в другом, но я попал сюда, потому что мое основное приложение разбилось после того, как потребление памяти стало слишком высоким, и я не могу найти способ снизить его, потому что я получаю эти раздражающие ошибки выпуска.
И ЕЩЕ ОДНО ОБНОВЛЕНИЕ:
Код, рисующий PDF-файл в методе Draw() представления:
CGContext context = UIGraphics.GetCurrentContext();
context.SaveState();
CGPDFDocument pdfDoc = CGPDFDocument.FromUrl(_pdfFileUrl);
if(pdfDoc.Pages >= 1)
{
CGPDFPage pdfPage = pdfDoc.GetPage(1);
context.ScaleCTM(SCALE.Width, SCALE.Height);
// the PDFRectangle is the media box rect of the page, which is hardcoded
// for now
context.TranslateCTM(-this.PDFRectangle.X, -this.PDFRectangle.Height - this.PDFRectangle.Y);
context.DrawPDFPage(pdfPage);
}
pdfDoc.Dispose();
context.RestoreState();