请帮助调试UILabel上的崩溃(evict_glyph_entry_from_cache)

时间:2010-12-07 16:25:54

标签: iphone objective-c cocos2d-iphone uilabel

我在“UILabel”中遇到了一个奇怪的崩溃。崩溃是从UILabel或CCLabelTTF的drawRect开始的。 (我已经花了很多时间谷歌搜索这个问题。)什么可能导致以下代码崩溃?

我正在使用XCode SDK 4.0和/或4.1,cocos2d版本0.99.4,0.99.5

CODE:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(200,100,185,110)];
[label setTextAlignment:UITextAlignmentLeft];
[label setFont:[UIFont fontWithName:@"Marker Felt" size:14]];

[label setLineBreakMode:UILineBreakModeWordWrap];
[label setAdjustsFontSizeToFitWidth:YES];
[label setNumberOfLines:50];
label.text = message;
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor colorWithRed:0 green:81.0/255 blue:100.0/255 alpha:1]];

[self addSubview:label];
[label release]; label = nil;

CRASH:

Assertion failed: (cache->size >= g->size), function evict_glyph_entry_from_cache, file Fonts/CGFontCache.c, line 836.
Program received signal:  “SIGABRT”.

#0  0x316b698c in __kill ()
#1  0x316b6982 in kill ()
#2  0x316b6974 in raise ()
#3  0x316cb620 in abort ()
#4  0x316b8f16 in __assert_rtn ()
#5  0x30f10d9e in evict_glyph_entry_from_cache ()
#6  0x30ed54e8 in expire_glyphs_nl ()
#7  0x30ed5494 in CGFontCacheUnlock ()
#8  0x30ed5008 in CGGlyphLockUnlock ()
#9  0x31e3a5e4 in ripc_RenderGlyphs ()
#10 0x31e42a66 in ripc_DrawGlyphs ()
#11 0x30ed0714 in CGContextDelegateDrawGlyphs ()
#12 0x30ed06c8 in draw_glyphs ()
#13 0x30ed025a in CGContextShowGlyphsWithAdvances ()
#14 0x311381f0 in WebCore::Font::drawGlyphs ()
#15 0x31137e42 in WebCore::Font::drawGlyphBuffer ()
#16 0x31137c76 in WebCore::Font::drawSimpleText ()
#17 0x31137ad2 in WebCore::Font::drawText ()
#18 0x31137a5e in drawAtPoint ()
#19 0x3117fdd4 in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:measureOnly:] ()
#20 0x31180c50 in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:] ()
#21 0x325ca46c in -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:lineSpacing:includeEmoji:] ()
#22 0x325ca40a in -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:lineSpacing:] ()
#23 0x325cb414 in -[UILabel _drawTextInRect:baselineCalculationOnly:] ()
#24 0x325cadf2 in -[UILabel drawTextInRect:] ()
#25 0x325cadaa in -[UILabel drawRect:] ()
#26 0x325c98e8 in -[UIView(CALayerDelegate) drawLayer:inContext:] ()
#27 0x30c6b308 in -[CALayer drawInContext:] ()
#28 0x30c6b190 in backing_callback ()
#29 0x30c6acb6 in CABackingStoreUpdate ()
#30 0x30c6a47e in -[CALayer _display] ()
#31 0x30c6a1ce in -[CALayer display] ()
#32 0x30c6a14a in CALayerDisplayIfNeeded ()
#33 0x30c6994a in CA::Context::commit_transaction ()
#34 0x30c696a8 in CA::Transaction::commit ()
#35 0x30c6f030 in CA::Transaction::observer_callback ()
#36 0x33519b56 in __CFRunLoopDoObservers ()
#37 0x33560a38 in CFRunLoopRunSpecific ()
#38 0x3356035c in CFRunLoopRunInMode ()
#39 0x30248b32 in GSEventRunModal ()
#40 0x30248bde in GSEventRun ()
#41 0x3259776e in -[UIApplication _run] ()
#42 0x32596472 in UIApplicationMain ()
#43 0x0000288e in main (argc=1, argv=0x2ffff618) at /Users/ahsan/Public/Drop Box/today1/main.m:13

3 个答案:

答案 0 :(得分:2)

我相信字体名称为@"MarkerFelt-Thin"。试试吧。

修改:还有@"MarkerFelt-Wide"

答案 1 :(得分:1)

它崩溃是因为您需要输入正确的字体名称,否则UIKit会尝试加载不存在的字体。所以,你应该检查你的字体名称。尝试使用@"MarkerFelt"(没有空格而不是@"Marker Felt",空格)。

如果您不确定该值应该是什么,那么应用程序商店中有多个应用程序可以为您获取当前可用字体的列表。您还可以使用this code snippet将字体名称记录到控制台:

   // Get all the fonts on the system
NSArray *familyNames = [UIFont familyNames];
for( NSString *familyName in familyNames ){
    printf( "Family: %s \n", [familyName UTF8String] );
    NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
    for( NSString *fontName in fontNames ){
        printf( "\tFont: %s \n", [fontName UTF8String] );
    }
}

修改

您还可以查看this post,看看它是否对您有帮助。

答案 2 :(得分:0)

值得一提的是应用程序执行繁重的处理

这也是我的观察!重负载会导致我的应用崩溃。此刻我认为这个问题是框架错误,应该报告。 https://bugreport.apple.com

更新CCLabelTTF(Cocos2D 0.99.5)

时发生了崩溃
Assertion failed: (cache->size >= g->size), function evict_glyph_entry_from_cache, file Fonts/CGFontCache.c, line 836.

Program received signal: “SIGABRT”.

This is the trace:

#0  0x304a0b2c in __kill ()
#1  0x304a0b20 in kill ()
#2  0x304a0b14 in raise ()
#3  0x304b7e3a in abort ()
#4  0x304a42f2 in __assert_rtn ()
#5  0x30f33648 in evict_glyph_entry_from_cache ()
#6  0x30ee5fc0 in expire_glyphs_nl ()
#7  0x30ee5f50 in CGFontCacheUnlock ()
#8  0x30ee5868 in CGGlyphLockUnlock ()
#9  0x33191ce0 in ripc_RenderGlyphs ()
#10 0x3319c9e0 in ripc_DrawGlyphs ()
#11 0x30edf7b0 in draw_glyphs ()
#12 0x30edf25c in CGContextShowGlyphsWithAdvances ()
#13 0x3109e010 in WebCore::Font::drawGlyphs ()
#14 0x3109dabc in WebCore::Font::drawGlyphBuffer ()
#15 0x3109d76c in WebCore::Font::drawSimpleText ()
#16 0x3109d5c8 in WebCore::Font::drawText ()
#17 0x3109d504 in drawAtPoint ()
#18 0x31101bd4 in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:measureOnly:] ()
#19 0x31103a78 in -[NSString(WebStringDrawing) _web_drawInRect:withFont:ellipsis:alignment:lineSpacing:includeEmoji:] ()
#20 0x331fcb60 in -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:lineSpacing:includeEmoji:] ()
#21 0x332f5184 in -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:] ()

#22 0x002f04a4 in -[CCTexture2D(Text) initWithString:dimensions:alignment:font:] (self=0x64e240, _cmd=0x455973, string=0x677040, dimensions={width = 28, height = 24}, alignment=UITextAlignmentCenter, uifont=0x649690) at /Users/SG/Documents/code/AlgWin/libs/cocos2d/CCTexture2D.m:405
#23 0x002f07a4 in -[CCTexture2D(Text) initWithString:fontName:fontSize:] (self=0x64e240, _cmd=0x44d3f4, string=0x677040, name=0x668990, size=20) at /Users/SG/Documents/code/AlgWin/libs/cocos2d/CCTexture2D.m:505
#24 0x002a8988 in -[CCLabelTTF setString:] (self=0x649490, _cmd=0x33f490cc, str=0x677040) at /Users/SG/Documents/code/AlgWin/libs/cocos2d/CCLabelTTF.m:91

注意22条线与你的相同。

我会尝试使用代码来重现崩溃。也许只是一个无限循环就足够了。