首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cgimagemaskcreate和内存泄漏,如何修复

cgimagemaskcreate和内存泄漏,如何修复
EN

Stack Overflow用户
提问于 2011-06-06 03:18:44
回答 2查看 1.3K关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
 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掩码释放的保留计数器,而work...mask不是指针...我怎样才能修复这个漏洞?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-06 06:08:51

Use CGImageRelease(mask) CGImageMaskCreate返回保留计数为1的CGImageRef。

票数 1
EN

Stack Overflow用户

发布于 2011-07-07 08:03:28

下面是一个无泄漏的util方法,它可以做你需要的事情:

代码语言:javascript
复制
- (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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6245245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档