2010-12-07 12 views
3

Ich stehe vor einem seltsamen Absturz in "UILabel". Der Absturz wird von drawRect von UILabel oder CCLabelTTF ausgelöst. (Ich habe schon viel Zeit damit verbracht, dieses Problem zu googeln.) Was könnte den folgenden Code zum Absturz bringen?Bitte helfe bei der Fehlersuche auf UILabel (evict_glyph_entry_from_cache)

ich XCode SDK bin mit 4.0 und/oder 4.1, cocos2d Version 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 

Antwort

1

Es stürzt ab, weil Sie den korrekten Zeichensatznamen eingeben müssen, sonst versucht UIKit, nicht vorhandene Schriftarten zu laden. Sie sollten also den Namen Ihrer Schriftart überprüfen. Versuchen Sie es mit @"MarkerFelt" (kein Platz anstelle von @"Marker Felt", mit dem Leerzeichen).

Wenn Sie nicht sicher sind, was der Wert sein sollte, gibt es mehrere Apps im App Store, die die Liste der derzeit verfügbaren Schriftarten für Sie abrufen können. Sie können auch this code snippet verwenden, um die Font-Namen an die Konsole zu protokollieren:

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

Sie auch einen Blick auf this post haben können und sehen, ob es Ihnen hilft.

+0

Vielen Dank für Ihre Antwort Sir, aber es gibt kein Problem in der Schriftart. Es funktioniert gut die meiste Zeit, aber stürzt gelegentlich zufällig ab ... Ich habe auch versucht, Systemschriftart, aber das Problem besteht weiter ... Der eigentliche Absturz tritt in UIStringDrawing Klasse von Apple. UILabel (UIKit) und CClabel (CCLabel) verwenden schließlich UIStringDrawing. – user533917

+0

@ user533917 können Sie bitte etwas mehr Kontext hinzufügen? (Beschreiben Sie Ihre cocos2d ein wenig mehr, vielleicht noch ein paar Codebeispiele.) – Moshe

+0

Dies ist ein Code-Snippet meiner benutzerdefinierten Warnung, die von UIView geerbt wurde, ich habe es animiert. Die Bezeichnung wird im init-Methodenaufruf festgelegt, es gibt nicht viel, was ich am Anfang mache, als Startanimationen aufzurufen. Kann dies in irgendeiner Weise mit den MEMORY-Problemen oder Projekteinstellungen verknüpft werden?Derzeit habe ich diese Einstellungen in meinem Projekt verwendet: Projekteinstellungen -> Standard (armv6 armv7), Zieleinstellungen -> Standard (armv6 armv7), Kompilieren für thumb (armv7) – user533917

2

Ich glaube, der Name der Schriftart ist @"MarkerFelt-Thin". Versuch das.

Bearbeiten: Es gibt auch eine @"MarkerFelt-Wide".

+0

Ich habe getan, was Sie gesagt haben. Nach dem Ändern der Schriftart Name von "Familienname" dh Marker Felt zu "font name" dh MarkerFelt-Thin, Der prozentuale Anteil des Absturzes hat sich verringert, aber es kommt immer noch zufällig. Hat es etwas mit Speicher oder Verarbeitung zu tun? Ich bin zu verwirrt, weiß nicht, was todo? – user533917

0
Eine Sache, erwähnenswert ist, dass die Anwendung schwere Verarbeitung

Dies ist auch meine Beobachtung macht! Bei starker Auslastung stürzt meine App ab. In diesem Moment glaube ich, dass dieses Problem der Framework-Bug ist und gemeldet werden sollte. https://bugreport.apple.com

Mein Absturz kommt, wenn die Aktualisierung 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 

Beachten Sie, dass 22 Zeilen zu Ihrem identisch sind.

Ich werde versuchen, mit dem Code zu kommen, um den Absturz zu reproduzieren. Vielleicht ist nur eine Endlosschleife genug.

Verwandte Themen