2012-01-09 22 views
3

私のコードでは、画像のサイズを指定されたサイズに伸ばします。これまでのコードはうまく動作します。 "UIGraphicsBeginImageContext()"が新しいイメージのメモリを解放しないという問題が発生しました。したがって、約10分後にメモリがいっぱいになり、アプリケーションはIOSによって終了します。UIGraphicsBeginImageContextはメモリ(リーク)オーバーフローにつながる

誰にもこの問題の解決策がありますか?このコードによって呼び出され

- (CCSprite *)createStretchedSignFromString:(NSString *)string withMaxSize:(CGSize)maxSize withImage:(UIImage *)signImage 
{ 
    // Create a new image that will be stretched with 10 px cap on each side 
    UIImage *stretchableSignImage = [signImage stretchableImageWithLeftCapWidth:10 topCapHeight:10]; 

    // Set size for new image 
    CGSize newImageSize = CGSizeMake(260.f, 78.0f); 

    // Create new graphics context with size of the answer string and some cap 
    UIGraphicsBeginImageContext(newImageSize); 

    // Stretch image to the size of the answer string 
    [stretchableSignImage drawInRect:CGRectMake(0.0f, 0.0f, newImageSize.width, newImageSize.height)]; 

    // Create new image from the context 
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 

    // End graphics context 
    UIGraphicsEndImageContext(); 

    // Create new texture from the stretched 
    CCTexture2D *tex = [[CCTexture2D alloc] initWithImage:resizedImage]; 

    CCSprite *spriteWithTex = [CCSprite spriteWithTexture:tex]; 

    [[CCTextureCache sharedTextureCache] removeTexture:tex]; 

    [tex release]; 

    // Return new sprite for the sign with the texture 
    return spriteWithTex; 
} 

// Create image from image path 
UIImage *targetSignImage = [UIImage imageWithContentsOfFile:targetSignFileName]; 

// Create new sprite for the sign with the texture 
CCSprite *plainSign = [self createStretchedSignFromString:answerString withMaxSize:CGSizeMake(260.0f, 78.0f) withImage:targetSignImage]; 

これまでありがとう。

+0

NSThreadで作成し、NSAutoreleasePoolを使用します。 私の提案です。 – SAKrisT

+1

私はcreateStretchedSignFromStringを保持すると思うし、リリースしなければならない* plainSign * – SAKrisT

+0

'targetSignImage'と' plainSign'はオートリリースされているので、リリースする必要はありません。私はすでにそれを試しました。 –

答えて

2

私は私の問題の解決策を見つけました。

まず、上記のコードは正確であり、漏れはありません。

この問題は、子としてplanSignのスプライトが削除されたために発生しました。スプライトは別のスレッド上で実行されるタイマーによって削除されるため、他のNSAutoreleasePoolではスプライトが削除されます。

[timerClass removeTarget:targetWithSign]空のプールを解放しました。

[timerClass performSelectorOnMainThread:@selector(removeTarget:) withObject:targetWithSign waitUntilDone:NO];は、ターゲットスプライトとその子を含む正しいプールplainSignを解放しました。

あなたの提案にSAKrisTとstigiのおかげです。

+0

私たちに知らせてくれてありがとう:) – stigi

関連する問題