2010-12-07 62 views
3

我面臨着「UILabel」中的一次奇怪的崩潰。該崩潰從UMLabel或CCLabelTTF的drawRect啓動)。 (我已經花了很多時間搜索這個問題。)什麼可能導致下列代碼崩潰?請幫助調試UILabel上的崩潰(evict_glyph_entry_from_cache)

我使用SDK的XCode 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 

回答

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,看看它是否可以幫助你。

+0

謝謝您的回覆先生,但字體沒有問題。它大部分時間工作正常,但有時會隨機崩潰...我也嘗試過系統字體,但問題仍然存在......實際崩潰發生在UIStringDrawing類的蘋果中。 UILabel(UIKit)和CClabel(CCLabel)最終都使用UIStringDrawing。 – user533917 2010-12-08 05:46:22

+0

@ user533917你能否請添加一些更多的上下文? (更多地描述你的cocos2d,也許還有更多的代碼示例。) – Moshe 2010-12-08 06:46:43

2

我相信字體名稱是@"MarkerFelt-Thin"。試試看。

編輯:還有一個@"MarkerFelt-Wide"

0
有一件事值得一提的是,應用程序不重處理

這也是我的觀察!大負載崩潰我的應用程序。在這一刻我相信這個問題是框架錯誤,應該報告。更新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行是相同的,當你https://bugreport.apple.com

我的碰撞來。

我會嘗試與代碼來重現崩潰。也許只是一個無限循環就足夠了。