Пожалуйста, помогите отладить сбой на UILabel (evict_glyph_entry_from_cache) - PullRequest
3 голосов
/ 07 декабря 2010

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

Я использую 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

Ответы [ 3 ]

2 голосов
/ 07 декабря 2010

Я считаю, что имя шрифта @"MarkerFelt-Thin". Попробуйте это.

Редактировать: Существует также @"MarkerFelt-Wide".

1 голос
/ 07 декабря 2010

Это сбой, потому что вам нужно ввести правильное имя шрифта, иначе UIKit попытается загрузить несуществующие шрифты.Итак, вы должны проверить название вашего шрифта.Попробуйте использовать @"MarkerFelt" (без пробела вместо @"Marker Felt" с пробелом).

Если вы не уверены, какое значение должно быть, в магазине приложений есть несколько приложений, которые могут получить список доступных на данный момент шрифтов для вас.Вы также можете использовать этот фрагмент кода для регистрации имен шрифтов на консоли:

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

РЕДАКТИРОВАТЬ:

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

0 голосов
/ 20 апреля 2011
Стоит отметить, что приложение выполняет тяжелую обработку

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...