#memory #uiview #xamarin.ios #out-of-memory #cgcontext
#память #uiview #xamarin.ios #нехватка памяти #cgcontext
Вопрос:
Я новичок в mono / iPhone и разрабатываю приложение, которое просматривает PDF-документ, используя UIView для каждой страницы, размещенной в UIScrollView. Каждый раз, когда я перехожу к следующей странице, в памяти сохраняется только новая страница /- 1, остальные сбрасываются (не UIViews, а страницы PDF).
Однако при отладке на устройстве после пролистывания достаточного количества страниц происходит сбой приложения, и я вижу в выводе приложения, что я получил предупреждения о памяти.
Я предполагаю, что это связано с тем, что растровые изображения, отображаемые в UIViews, не удаляются из памяти, поэтому после некоторых исследований я нашел метод CGContextRelease() в Objective C — однако, этого не существует в MonoTouch. Единственный подобный метод, который я смог найти, был в классе UIGraphics , но он имеет дело только с «текущим» графическим контекстом, каким бы он ни был (я не могу установить его на существующий, это точно).
Итак, как мне освободить графический контекст в UIView? Возможно ли это вообще? Какие у меня варианты? Надеюсь, кто-нибудь может помочь, это сводит меня с ума..
Ответ №1:
CGContextRelease
вызывается автоматически, когда CGContext
экземпляр освобождается, либо вручную (при Dispose
вызове), либо когда сборщик мусора (GC) запускает финализатор.
Если вы создаете свои собственные CGContext
экземпляры, вам следует вызвать Dispose (или use using
), чтобы гарантировать, что вы контролируете, когда ресурсы будут освобождены. В противном случае сбор данных может занять слишком много времени, что приведет к нехватке памяти.
Тот же совет применим к любому IDisposable
экземпляру, который вы создаете в своем приложении (т. Е. Ваша проблема может быть связана с чем-то другим).
Примечание: вы повторно используете свой UIView? или удалить / утилизировать их? (это тоже вероятный кандидат)
Комментарии:
1. У меня было по одному
UIView
на страницу, и я хотел удалить кэшированную графику, чтобы я мог продолжать иметь все эти представления. ОднакоCGContext.Dispose()
или ручная сборка мусора вообще не сработала, так что в итоге я дал себе пощечину и просто использовал threeUIView
s, которые теперь использую повторно. Теперь все работает гладко.2. Трудно быть уверенным, не зная количества страниц / UIView, которые вы создавали, но я считаю, что это была ваша основная проблема с памятью. В любом случае их повторное использование — самое приятное, что можно сделать (поскольку вы делитесь устройством с другими приложениями). Рад, что у вас это работает
![]()