0

以下代码按我想要的方式工作,但每次我调用它时,Instruments 都会告诉我有一个 CGImage 内存泄漏。我一直无法理解要发布什么以及何时发布。以下来自我文件的@interface 部分。

CGImageRef depthImageRef;
char *depthPixels;
NSData *depthData;

在接下来的代码中,我基本上会更改 depthPixels,然后将结果存储在新的 depthImageRef 中。

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 设置为 nil,通常当我这样做时我会崩溃。谢谢!

4

3 回答 3

1

可能,您必须在某处将 depthImageRef 转回 UIImage 。喜欢

UIImage *depthImage = [UIImage imageWithCGImage:depthImageRef];

一旦你有了depthImage,你就可以释放depthImageRef。它不应该导致任何崩溃。

于 2014-09-17T02:19:57.450 回答
0

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

// works, even if depthImageRef is NULL such as in the initial case.
CGImageRelease(depthImageRef);
depthImageRef = CGImageCreate ( //...

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

于 2014-09-17T02:38:24.460 回答
0

您所要做的就是在使用完 CGImageRef后释放它。

CGImageRelease(cgImage);
于 2021-03-08T19:23:52.083 回答