下面的代码按照我希望的方式工作,但是每次我调用它时,仪器都告诉我我有一个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设置为零,而且通常当我这样做时,就会出现崩溃。谢谢!
发布于 2014-09-17 02:38:24
如果通过调用上述代码多次重新创建depthImageRef,则通过反复创建CGImageRefs而不释放它们来泄漏内存。如果要重新创建dataImageRef,则应在创建新映像之前立即释放旧图像。
// 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)。
发布于 2014-09-17 02:19:57
可能,您一定是在某个地方将depthImageRef转回UIImage。喜欢
UIImage *depthImage = [UIImage imageWithCGImage:depthImageRef];一旦您拥有了depthImage,就可以发布depthImageRef了。它不应该造成任何碰撞。
发布于 2021-03-08 19:23:52
您需要确保的是,一旦您完成了CGImageRef的使用,就会发布它。
CGImageRelease(cgImage);https://stackoverflow.com/questions/25881150
复制相似问题