2010-12-07 3 views
3

Я столкнулся с странным сбоем в «UILabel». Авария начинается с drawRect из UILabel или CCLabelTTF). (Я уже много времени тратил на эту проблему.) Что может привести к сбою следующего кода?Пожалуйста, помогите отладить сбой на UILabel (evict_glyph_entry_from_cache)

Я использую XCode SDK 4.0 и/или 4.1, cocos2d версия 0.99.4, 0.99.5

КОД:

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]); 
    } 
} 

EDIT:

Вы также можете посмотреть на this post и посмотреть, если он помогает вам.

+0

Благодарим вас за ответ sir, но в шрифте нет проблем. Он отлично работает много раз, но иногда случается сбой ... Я также попробовал системный шрифт, но проблема не устранена ... Фактический сбой происходит в классе UIStringDrawing для Apple. И 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
Одна вещь стоит отметить, что приложение делает тяжелой обработки

Это также мое наблюдение! Тяжелая загрузка вызывает мое приложение. В этот момент я считаю, что эта проблема является ошибкой структуры и должна быть представлена. 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 линии идентичны вашим.

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

Смежные вопросы