cgimagemaskсоздать и утечка памяти, как это исправить - PullRequest
0 голосов
/ 05 июня 2011

у меня есть этот код:

 Texture2D *cachedTexture;

if(cachedTexture = [cachedTextures objectForKey:aName]) {
    return cachedTexture;
}

// We are using imageWithContentsOfFile rather than imageNamed, as imageNamed caches the image in the device.
// This can lead to memory issue as we do not have direct control over when it would be released.  Not using
// imageNamed means that it is not cached by the OS and we have control over when it is released.
NSString *filename = [aName stringByDeletingPathExtension];
NSString *filetype = [aName pathExtension];
NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:filetype];

UIImage *maskImage=[UIImage imageWithContentsOfFile:path];
CGImageRef maskRef = maskImage.CGImage;     
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                    CGImageGetHeight(maskRef),
                                    CGImageGetBitsPerComponent(maskRef),
                                    CGImageGetBitsPerPixel(maskRef),
                                    CGImageGetBytesPerRow(maskRef),
                                    CGImageGetDataProvider(maskRef), NULL, false);  

cachedTexture = [[Texture2D alloc] initWithMask:mask filter:aFilter];

[cachedTextures setObject:cachedTexture forKey:aName];

Статический анализатор написал это: 1) вызов функции CGImageMaskCreate возвращает базовый базовый объект со счетчиком удержания +1 2) объект, выделенный и сохраненный в маске, не упоминается позже в этом пути выполнения и имеет счетчик сохранения +1 [выпуск маски] не работает ... маска не является указателем ... как я могу исправить эту утечку?

Ответы [ 2 ]

5 голосов
/ 07 июля 2011

Вот метод утилизации без утечек, который делает то, что вам нужно:

- (UIImage*) maskImage:(UIImage *)image
              withMask:(UIImage *)maskImage
{
        CGImageRef imageRef = image.CGImage;
        CGImageRef maskRef = maskImage.CGImage;

        CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                      CGImageGetHeight(maskRef),
                                      CGImageGetBitsPerComponent(maskRef),
                                      CGImageGetBitsPerPixel(maskRef),
                                      CGImageGetBytesPerRow(maskRef),
                                      CGImageGetDataProvider(maskRef),
                                      NULL, // decode should be NULL
                                      FALSE // shouldInterpolate
                                      );

        CGImageRef masked = CGImageCreateWithMask(imageRef, mask);
        CGImageRelease(mask);
        UIImage *maskedImage = [UIImage imageWithCGImage:masked];
        CGImageRelease(masked);
        return maskedImage;
}
1 голос
/ 06 июня 2011

Использование CGImageRelease(mask) CGImageMaskCreate возвращает CGImageRef с счетом сохранения 1.

...