2011-10-07 31 views
1

我在我的場景這兩種方法:CCLabelBMFont在未通知的情況下崩潰?

-(void)damageText:(NSString*)text atPosition:(CGPoint)position { 
    CCLabelBMFont *label = [CCLabelBMFont labelWithString:text fntFile:@"Font2.fnt"]; 
    label.position = position; 
    [self addChild:label z:50]; 
    label.scale = 0.01; 
    [label runAction:[CCSequence actions:[CCScaleTo actionWithDuration:0.08 scale:1.0], 
         [CCDelayTime actionWithDuration:0.2],[CCFadeOut actionWithDuration:0.8], 
         [CCCallFuncN actionWithTarget:self selector:@selector(killLabel:)],nil]]; 
    label.opacity = 0; 
    [label runAction:[CCFadeIn actionWithDuration:0.04]]; 
} 

-(void)killLabel:(id)sender { 
    CCLabelBMFont *label = (CCLabelBMFont*)sender; 
    [self removeChild:label cleanup:YES]; 
} 

因此,首先,我用的是damageText方法,和我的留言好嗎彈出。然後它淡出並從場景中移除。

但我第二次做到這一點,它崩潰,與EXC_BAD_ACCESS消息說

*終止應用程序由於未捕獲的異常「NSInternalInconsistencyException」,理由是:「TextureCache:fileimage絕不能nill」

但我不太明白。如果它之前找到了Font2.png,爲什麼它第二次失敗?

我懷疑CCLabelBMFont.m沒有正確的線

configuration_ = FNTConfigLoadFile(fntFile); 

加載configuration_變量,因爲當我嘗試NSLog的是,我得到一個EXC_BAD_ACCESS信號。

+0

好的,我發現如果我不從場景的孩子中移除標籤,錯誤不會發生。但是,嘿,那麼我該如何處理...呃,標籤本身?它不會堆疊內存嗎? – Voldemort

回答

1

根據您的評論,我認爲您可能會找到可能有效的解決方案。而不是調用damageText ...

​​

每次爲什麼不乾脆讓你在構造函數初始化一個成員變量,然後只在damageText功能設置文本。所以你最終會與..

-(void)damageText:(NSString*)text atPosition:(CGPoint)position { 
    // CCLabelBMFont *label = [CCLabelBMFont labelWithString:text fntFile:@"Font2.fnt"]; 
    label.position = position; 
    //[self addChild:label z:50]; 
    label.scale = 0.01; 
    [label runAction:[CCSequence actions:[CCScaleTo actionWithDuration:0.08 scale:1.0], 
         [CCDelayTime actionWithDuration:0.2],[CCFadeOut actionWithDuration:0.8], 
         [CCCallFuncN actionWithTarget:self selector:@selector(killLabel:)],nil]]; 
    label.opacity = 0; 
    [label runAction:[CCFadeIn actionWithDuration:0.04]]; 
} 

我甚至不會擔心刪除標籤。讓標籤的父母在取消分配時處理這個問題(我假設CCLayer或CCScene對象?)。如果要從視圖中刪除標籤,只需將其可見性設置爲false或其比例爲0.

UPDATE:也調用了addChild調用。你只需要做一次,並可能在構造函數中完成。

相關問題