Ползучая память при запуске программы, CGGlyphBitmapCreate (среди прочих)? - PullRequest
5 голосов
/ 02 декабря 2011

Это совмещает вчера более широкий вопрос. Я использовал кучи для выявления проблем, но все они в вызывающих программах, с которыми я не знаком. Методы, которые я написал сам, не отображаются, но CoreGraphics, похоже, пожирает память как сумасшедшую.

Я был готов отправить свое приложение на этой неделе, но столкнулся с огромной проблемой. Я много занимался QA, обнаружением утечек и заканчивал процесс профилированием кучи / выделения. К сожалению, все пошло не так, как планировалось. Программа сама по себе не «протекает», но, несомненно, набирает обороты.

Лучший способ объяснить программу - математическая карта (первое приложение, изучая веревки, я хотел упростить его). Есть 5 кнопок, 2 просмотра изображений и 2 UILabels. Я врезаюсь головой в стену и задаюсь вопросом, не является ли мой дизайн проблемой (краткий ответ: вероятно), но меня больше беспокоит ползучесть памяти, которая почти наверняка не позволит мне попасть в магазин приложений.

Итак, процесс: В представлении отображаются кнопка «Домой» (для возврата в главное меню), флажок (для обозначения проблемы на потом), математическая задача в UILabel и кнопка «Получить ответ». Когда вы нажмете кнопку «Получить ответ», во второй UILabel отобразится «Ответ», и появятся еще две кнопки («Право» и «Неправильно»), а заголовок кнопки «Получить ответ» изменится на «Получить проблему». Нажатие «Get Problem» возвращает нас к началу, с новой проблемой.

Я использовал heapshot, чтобы определить объем занимаемой памяти, и обнаружил, что теряю по 10-15 КБ каждый раз, когда проходил одну итерацию (нажимая «Получить ответы», затем нажимая либо « Правильно "или" Неправильно "). Худшим нарушителем является CGGlyphBitmapCreate, который, честно говоря, мало что знает о том, что это на самом деле.

Некоторые другие примечания. Кнопка «home» - это настраиваемая кнопка с расширением .png, созданная в IB. «Помеченная» кнопка без текста, расположенная поверх двух .png, между которыми я переключаюсь (через .hidden) в зависимости от состояния флажка (я скрываю один, затем отображаю другой, и наоборот).

Стек вызовов:

0 libSystem.B.dylib calloc
1 CoreGraphics CGGlyphBitmapCreate
2 CoreGraphics CGFontCreateGlyphBitmap8
3 CoreGraphics CGFontCreateGlyphBitmap
4 CoreGraphics CGGlyphLockLockGlyphBitmaps
5 libRIP.A.dylib ripc_DrawGlyphs
6 CoreGraphics draw_glyphs
7 CoreGraphics CGContextShowGlyphsWithAdvances
8 WebCore WebCore::showGlyphsWithAdvances(WebCore::FloatPoint const&, WebCore::SimpleFontData const*, CGContext*, unsigned short const*, CGSize const*, unsigned long)
9 WebCore WebCore::Font::drawGlyphs(WebCore::GraphicsContext*, WebCore::SimpleFontData const*, WebCore::GlyphBuffer const&, int, int, WebCore::FloatPoint const&, bool) const
10 WebCore WebCore::Font::drawSimpleText(WebCore::GraphicsContext*, WebCore::TextRun const&, WebCore::FloatPoint const&, int, int) const
11 WebCore WebCore::Font::drawText(WebCore::GraphicsContext*, WebCore::TextRun const&, WebCore::FloatPoint const&, int, int) const
12 WebKit drawAtPoint(unsigned short const*, int, WebCore::FloatPoint const&, WebCore::Font const&, WebCore::GraphicsContext*, bool, WebCore::BidiStatus*, int)
13 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:renderedStringOut:drawUnderline:]
14 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:renderedStringOut:]
15 WebKit -[NSString(WebStringDrawing) __web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:measureOnly:]
16 WebKit -[NSString(WebStringDrawing) _web_drawAtPoint:forWidth:withFont:ellipsis:letterSpacing:includeEmoji:]
17 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:lineBreakMode:letterSpacing:includeEmoji:]
18 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:includeEmoji:]
19 UIKit -[NSString(UIStringDrawing) drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:]
20 UIKit -[UILabel _drawTextInRect:baselineCalculationOnly:]
21 UIKit -[UILabel drawTextInRect:]
22 UIKit -[UILabel drawRect:]
23 UIKit -[UIView(CALayerDelegate) drawLayer:inContext:]
24 QuartzCore -[CALayer drawInContext:]
25 QuartzCore backing_callback(CGContext*, void*)
26 QuartzCore CABackingStoreUpdate_
27 QuartzCore CA::Layer::display_()
28 QuartzCore -[CALayer _display]
29 QuartzCore CA::Layer::display()
30 QuartzCore -[CALayer display]
31 QuartzCore CA::Layer::display_if_needed(CA::Transaction*)
32 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
33 QuartzCore CA::Transaction::commit()
34 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
35 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
36 CoreFoundation __CFRunLoopDoObservers
37 CoreFoundation __CFRunLoopRun
38 CoreFoundation CFRunLoopRunSpecific
39 CoreFoundation CFRunLoopRunInMode
40 GraphicsServices GSEventRunModal
41 GraphicsServices GSEventRun
42 UIKit UIApplicationMain
43 MathProb main /Users/test/MathProb/main.m:14
44 MathProb start

Заранее спасибо.

1 Ответ

0 голосов
/ 19 апреля 2012

Есть ли у NSZombieEnabled значение YES?Я считаю, что это может вызвать ложные срабатывания.Один из способов убедиться, что вы не видите артефакт вашей среды разработки, - перейти в режим выпуска: команда + опция + R, установить запуск в режим выпуска.Затем запустите приложение.Теперь дважды нажмите кнопку «Домой» на iPad, закройте приложение и запустите его с домашнего экрана в обычном режиме.Я видел, как ложные срабатывания утечки памяти исчезали при запуске таким способом.

...