MonoTouch CoreGraphics Проблемы с памятью PDF с CGPDFDocument и CGPDFPage - PullRequest
1 голос
/ 18 февраля 2010

Я работаю с 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();

Ответы [ 2 ]

3 голосов
/ 22 февраля 2010

Это было вызвано ошибкой в ​​MonoTouch Alpha, которая будет исправлена ​​в версии 1.9.3

1 голос
/ 19 февраля 2010

Приведенная выше трассировка стека показывает, что код выпуска PDF был вызван из потока финализатора, а не непосредственно из Dispose.

Не могли бы вы предоставить мне контрольный пример с этой проблемой? После того, как у нас будет тестовый пример, мы сможем дать вам исправление или обходной путь через пару часов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...