首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGImage内存泄漏

CGImage内存泄漏
EN

Stack Overflow用户
提问于 2014-09-17 02:04:36
回答 3查看 925关注 0票数 0

下面的代码按照我希望的方式工作,但是每次我调用它时,仪器都告诉我我有一个CGImage内存泄漏。我一直不知道该放什么,什么时候放。以下内容来自我文件的@interface部分。

代码语言:javascript
复制
CGImageRef depthImageRef;
char *depthPixels;
NSData *depthData;

在下一段代码中,我基本上修改了depthPixels,然后将结果存储在一个新的depthImageRef中。

代码语言:javascript
复制
size_t width                    = CGImageGetWidth(depthImageRef);
size_t height                   = CGImageGetHeight(depthImageRef);
size_t bitsPerComponent         = CGImageGetBitsPerComponent(depthImageRef);
size_t bitsPerPixel             = CGImageGetBitsPerPixel(depthImageRef);
size_t bytesPerRow              = CGImageGetBytesPerRow(depthImageRef);


for (int row = 0; row < height; row += 1) {

    for (int bitPlace = 0; bitPlace < bytesPerRow; bitPlace += 4) {

        CGPoint pointForHeight = CGPointMake((bitPlace/4) - place.x, row - place.y);

        int distanceFromLocation = sqrt(pow(place.x - pointForHeight.x, 2) + pow(place.y - pointForHeight.y, 2));
        int newHeight = blopHeight - (5 - sizeSlider.value)*distanceFromLocation;

        NSInteger baseBitPlace = row*bytesPerRow + bitPlace;

        CGFloat currentHeight = depthPixels[baseBitPlace];
        if (newHeight > currentHeight) {
            depthPixels[baseBitPlace] = newHeight;
        }
    }
}

CGColorSpaceRef colorspace      = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo         = CGImageGetBitmapInfo(depthImageRef);
CGDataProviderRef provider      = CGDataProviderCreateWithData(NULL, depthPixels, [depthData length], NULL);

depthImageRef = CGImageCreate (
                               width,
                               height,
                               bitsPerComponent,
                               bitsPerPixel,
                               bytesPerRow,
                               colorspace,
                               bitmapInfo,
                               provider,
                               NULL,
                               false,
                               kCGRenderingIntentDefault
                               );
CGColorSpaceRelease(colorspace);
CFRelease(provider);
CGDataProviderRelease(provider);

我相信这个漏洞是因为我一直在创建depthImageRef,但从来没有释放过它。我尝试过将CGImageRelease( depthImageRef )放置在不同的位置,并将depthImageRef设置为零,而且通常当我这样做时,就会出现崩溃。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-17 02:38:24

如果通过调用上述代码多次重新创建depthImageRef,则通过反复创建CGImageRefs而不释放它们来泄漏内存。如果要重新创建dataImageRef,则应在创建新映像之前立即释放旧图像。

代码语言:javascript
复制
// works, even if depthImageRef is NULL such as in the initial case.
CGImageRelease(depthImageRef);
depthImageRef = CGImageCreate ( //...

还要确保在CGImageRelease方法中调用dealloc,并在dealloc中释放depthPixels缓冲区。CGDataProviderRelease不会释放您传递给它的缓冲区,除非您传递一个回调以释放该缓冲区。您不需要调用CFRelease(provider),因为您正在调用CGDataProviderRelease(provider)

票数 0
EN

Stack Overflow用户

发布于 2014-09-17 02:19:57

可能,您一定是在某个地方将depthImageRef转回UIImage。喜欢

代码语言:javascript
复制
UIImage *depthImage = [UIImage imageWithCGImage:depthImageRef];

一旦您拥有了depthImage,就可以发布depthImageRef了。它不应该造成任何碰撞。

票数 1
EN

Stack Overflow用户

发布于 2021-03-08 19:23:52

您需要确保的是,一旦您完成了CGImageRef的使用,就会发布它。

代码语言:javascript
复制
CGImageRelease(cgImage);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25881150

复制
相关文章

相似问题

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