程序运行时内存蠕变,CGGlyphBitmapCreate(以及其他)?

时间:2011-12-02 18:31:01

标签: ios memory-management core-graphics allocation heapshot

昨天这是一个更广泛的问题。我一直用快照来查明问题,但他们都是我不熟悉的来电者。我自己编写的方法没有出现,但CoreGraphics似乎像疯了一样吃着记忆。

我本周准备提交我的应用程序,但遇到了一个大问题。我一直在做很多QA和泄漏检测,并且正在完成快照/分配分析的过程。不幸的是,这没有按计划进行。该计划本身并没有“泄漏”,但它无疑正在攀升。

解释该程序的最佳方式是数学闪卡(第一个应用程序,学习绳索,我想简化)。有5个按钮,2个图像视图和2个UILabel。 我正在敲我的脑袋,想知道我的设计是不是一个问题(可能是简短的回答),但更关心内存蠕变几乎肯定不允许我进入应用程序商店。

所以,过程: 视图显示“主页”按钮(用于返回主菜单),“复选框”(用于标记以后的问题),UILabel中的数学问题以及“获取应答”按钮。当您按下获取答案时,答案将显示在第二个UILabel中,并且会出现另外两个按钮(右侧和右侧),并且“获取答案”按钮标题将更改为“获取问题”。按Get Get将我们重新设置为开头,出现新问题。

我一直在使用快照来查找正在占用多少内存,而且我发现每次完成一次迭代后我都会丢失10-15KB(按“Get Answers”然后按“或”对还是错”)。最糟糕的罪犯是所谓的“CGGlyphBitmapCreate”,老实说我对它究竟是什么一无所知。

其他一些注意事项:“主页”按钮是一个自定义按钮,在IB中创建了一个.png。 “标记”按钮没有位于两个.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 :(得分:0)

你有NSZombieEnabled设置为YES吗?我相信这可能会导致误报。验证您没有看到开发环境的工件的一种方法是更改​​为发布模式:command + option + R,将run设置为使用发布模式。然后,运行该应用程序。现在,快速按下iPad上的主页按钮两次,终止应用程序,并从主屏幕正常启动它。我发现当以这种方式启动时,误报的内存泄漏就会消失。