Я работаю с MonoTouch уже 3 недели, и все шло отлично, пока мне не пришлось отображать PDF-файлы в своем приложении.
Использование Apple 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. Поэтому я подумал, что МТ управляет этими объектами автоматически, но, видимо, это не так или он глючит.
Даже когда я не связываюсь с Dispose () объекта CGPDF, вышеупомянутая ошибка возникает, когда я удаляю представление, содержащее PDF, из суперпредставления.
Кто-нибудь мог работать с PDF-файлами в MonoTouch?
Заранее спасибо.
UPDATE:
Я протестировал рисование PDF в Obj-C с теми же PDF-файлами и обнаружил, что когда я не вызываю CGPDFDocumentRelease (), потребление памяти имеет такую же тенденцию к быстрому росту, как в MonoTouch. При вызове CGPDFDocumentRelease () в Obj-C потребление памяти нормальное.
Поэтому я думаю, что MonoTouch действительно не освобождает объекты CGPDFDocument и CGPDFPage, и когда я пытаюсь освободить их вручную или косвенно (удаляя содержащиеся в них представления), я получаю вышеуказанную ошибку.
Это отстой, и теперь есть реальная возможность переписать код в Obj-C ... F $ # k !!
ДРУГОЕ ОБНОВЛЕНИЕ:
Я до сих пор не могу понять, почему я получаю ошибки, связанные с выпуском, но я сделал проект MonoTouch и XCode, в котором оба по сути делают одно и то же: рисуют PDF.
Я сравнил использование памяти в Activity Monitor и обнаружил, что, хотя приложение MonoTouch постоянно увеличивает использование памяти, XCode - нет. Я даже вызываю Dispose () для объекта CGPDFDocument в MonoTouch, и тем не менее потребление памяти увеличивается.
Ни одно из приложений не дает сбоя с ошибкой, связанной с выпуском, но действительно беспокоит то, что использование mem в приложении 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();