2012-01-09 3 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 и стиги для ваших предложений.

+0

спасибо, что указал нам :) – stigi

Смежные вопросы