2010-12-07 21 views
3

Je suis confronté à un accident étrange dans "UILabel". L'accident est initié à partir de drawRect de UILabel ou CCLabelTTF). (J'ai déjà passé beaucoup de temps à googler ce problème.) Qu'est-ce qui pourrait causer le crash du code suivant?S'il vous plaît aider à déboguer un accident sur UILabel (evict_glyph_entry_from_cache)

J'utilise SDK XCode 4.0 et/ou 4.1, la version 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 

Répondre

1

Il plante parce que vous devez entrer le nom de police correct, sinon UIKit essaiera de charger des polices inexistantes. Donc, vous devriez vérifier votre nom de police. Essayez d'utiliser @"MarkerFelt" (pas d'espace au lieu de @"Marker Felt", avec l'espace).

Si vous n'êtes pas sûr de la valeur, plusieurs applications sur l'App Store peuvent obtenir la liste des polices actuellement disponibles pour vous. Vous pouvez également utiliser this code snippet pour enregistrer les noms de polices à la console:

// 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:

Vous pouvez également jeter un oeil à this post et voir si elle vous aide.

+0

Merci pour votre réponse monsieur, mais il n'y a pas de problème dans la police. Cela fonctionne très bien la plupart du temps, mais se bloque aléatoirement parfois ... J'ai également essayé la police système mais le problème persiste ... Le crash réel se produit dans la classe UIStringDrawing d'apple. UILabel (UIKit) et CClabel (CCLabel) utilisent à la fois UIStringDrawing. – user533917

+0

@ user533917 pouvez-vous s'il vous plaît ajouter un peu plus de contexte? (Décrivez un peu plus votre cocos2d, peut-être un peu plus d'exemples de code.) – Moshe

+0

Ceci est un extrait de code de mon alerte personnalisée héritée de UIView, je l'ai animé. L'étiquette est définie dans l'appel de la méthode init, il n'y a pas grand-chose que je fasse dans ce que d'appeler les animations de démarrage à la fin. Cela peut-il être lié de toute façon aux problèmes de mémoire ou aux paramètres du projet?actuellement j'ai utilisé ces paramètres dans mon projet: Paramètres du projet -> Standard (armv6 armv7), Paramètres cible -> Standard (armv6 armv7), Compiler pour le pouce (armv7) – user533917

2

Je crois que le nom de police est @"MarkerFelt-Thin". Essayez ça.

Édition: Il existe également un @"MarkerFelt-Wide".

+0

J'ai fait ce que vous avez dit. Après avoir changé le nom de police de "nom de famille" à savoir Marker Felt à "nom de police" à savoir MarkerFelt-Thin, le pourcentage d'accident a diminué mais il vient toujours au hasard.Est-ce qu'il doit faire quelque chose avec la mémoire ou le traitement? Je suis trop confus, ne sais pas quoi faire? – user533917

0
Une chose à noter est que l'application ne traitement lourd

C'est aussi mon observation! Une charge lourde bloque mon application. En ce moment, je crois que ce problème est le bug de l'infrastructure et devrait être signalé. https://bugreport.apple.com

Mon accident vient quand la mise à jour 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 

Observons que 22 lignes sont identiques à la vôtre.

Je vais essayer de venir avec le code pour reproduire le crash. Peut-être qu'une simple boucle infinie suffira.