Не хватает памяти со многими UIViews, не можете выпустить CGContext в монотач?

Я новичок в моно/iPhone и разрабатываю приложение, которое просматривает PDF-документ, используя UIView для каждой страницы, помещенный в UIScrollView. Каждый раз, когда я прокручиваю следующую страницу, в памяти сохраняется только новая страница +/- 1, остальные сбрасываются (не UIViews, а страницы PDF).

Однако при отладке на устройстве после перелистывания достаточного количества страниц происходит сбой приложения, и я вижу в выводе приложения, что я получил предупреждения о памяти.

Я предполагаю, что это связано с тем, что растровые изображения, отображаемые в UIViews, не удаляются из памяти, поэтому после некоторых исследований я нашел метод CGContextRelease() в Objective C, однако его нет в MonoTouch. Единственный подобный метод, который я смог найти, был в классе UIGraphics, но он касается только «текущего» графического контекста, каким бы он ни был (я не могу установить его на существующий, это точно).

Итак, как мне освободить графический контекст в UIView? Это вообще возможно? Каковы мои варианты? Надеюсь, кто-нибудь может помочь, это сводит меня с ума ..


person Arne    schedule 25.10.2011    source источник


Ответы (1)


CGContextRelease вызывается автоматически при освобождении экземпляра CGContext либо вручную (при вызове Dispose), либо когда сборщик мусора (GC) запускает финализатор.

Если вы создаете свои собственные экземпляры CGContext, вам следует вызвать Dispose (или использовать using), чтобы убедиться, что вы контролируете когда ресурсы будут освобождены. В противном случае GC может занять слишком много времени, прежде чем собирать их, что приведет к нехватке памяти.

Тот же совет относится к любому экземпляру IDisposable, который вы создаете в своем приложении (т. е. ваша проблема может быть связана с чем-то другим).

Примечание: вы повторно используете свой UIView? или удалить/утилизировать их? (тоже вероятный кандидат)

person poupou    schedule 25.10.2011
comment
У меня был один UIView на страницу, и я хотел удалить кешированную графику, чтобы я мог продолжать иметь все эти представления. Однако CGContext.Dispose() или ручная сборка мусора вообще не работали, поэтому я в итоге дал себе пощечину и просто использовал три UIView, которые теперь использую повторно. Теперь все работает гладко. - person Arne; 28.10.2011
comment
Трудно быть уверенным, не зная количества страниц/UIView, которые вы создавали, но я считаю, что это была ваша основная проблема с памятью. В любом случае их повторное использование — лучший способ (поскольку вы делитесь устройством с другими приложениями). Рад, что у вас все работает :-) - person poupou; 28.10.2011