- html - 我的下拉菜单的内容关闭得太快
- c# - 使用 Html Agility Pack 从网页中的表中获取值而不使用 "SelectNode'
- html - 内容容器下的 CSS 下拉菜单
- html - 如何停止嵌套列表重叠父列表?
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage > create_bitmap_data_provider > malloc,这占用了我的 objectalloc 的 60%。
使用 NSTimer 多次调用此代码。
//GET IMAGE FROM RESOURCE DIR
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
UIImage * blurMe = [UIImage imageWithData:imageData];
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width / dblBlurLevel, blurMe.size.width / dblBlurLevel) interpolationQuality:3.0];
UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0];
UIImage * imageCopy = [[UIImage alloc] initWithCGImage:labelImage.CGImage];
[pool drain]; // deallocates scaledImage and labelImage
imgView.image = imageCopy;
[imageCopy release];
下面是模糊函数。我相信 objectalloc 问题就在这里。也许我只是需要一双新鲜的眼睛。如果有人能解决这个问题那就太好了。抱歉有点长...我会尝试缩短它。
@implementation UIImage(Blur)
- (UIImage *)blurredCopy:(int)pixelRadius
{
//VARS
unsigned char *srcData, *destData, *finalData;
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
//IMAGE SIZE
size_t pixelsWide = CGImageGetWidth(self.CGImage);
size_t pixelsHigh = CGImageGetHeight(self.CGImage);
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL) { return NULL; }
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL) { CGColorSpaceRelease( colorSpace ); }
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst );
if (context == NULL) { free (bitmapData); }
CGColorSpaceRelease( colorSpace );
free (bitmapData);
if (context == NULL) { return NULL; }
//PREPARE BLUR
size_t width = CGBitmapContextGetWidth(context);
size_t height = CGBitmapContextGetHeight(context);
size_t bpr = CGBitmapContextGetBytesPerRow(context);
size_t bpp = (CGBitmapContextGetBitsPerPixel(context) / 8);
CGRect rect = {{0,0},{width,height}};
CGContextDrawImage(context, rect, self.CGImage);
// Now we can get a pointer to the image data associated with the bitmap
// context.
srcData = (unsigned char *)CGBitmapContextGetData (context);
if (srcData != NULL)
{
size_t dataSize = bpr * height;
finalData = malloc(dataSize);
destData = malloc(dataSize);
memcpy(finalData, srcData, dataSize);
memcpy(destData, srcData, dataSize);
int sums[5];
int i, x, y, k;
int gauss_sum=0;
int radius = pixelRadius * 2 + 1;
int *gauss_fact = malloc(radius * sizeof(int));
for (i = 0; i < pixelRadius; i++)
{
.....blah blah blah...
THIS IS JUST LONG CODE THE CREATES INT FIGURES
........blah blah blah......
}
if (gauss_fact) { free(gauss_fact); }
}
size_t bitmapByteCount2 = bpr * height;
//CREATE DATA PROVIDER
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, srcData, bitmapByteCount2, NULL);
//CREATE IMAGE
CGImageRef cgImage = CGImageCreate(
width,
height,
CGBitmapContextGetBitsPerComponent(context),
CGBitmapContextGetBitsPerPixel(context),
CGBitmapContextGetBytesPerRow(context),
CGBitmapContextGetColorSpace(context),
CGBitmapContextGetBitmapInfo(context),
dataProvider,
NULL,
true,
kCGRenderingIntentDefault
);
//RELEASE INFORMATION
CGDataProviderRelease(dataProvider);
CGContextRelease(context);
if (destData) { free(destData); }
if (finalData) { free(finalData); }
if (srcData) { free(srcData); }
UIImage *retUIImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return retUIImage;
}
我唯一能想到的是阻止 objectalloc 的是这个 UIImage *retUIImage = [UIImage imageWithCGImage:cgImage];...但是在返回后如何释放它?希望有人能帮忙。
最佳答案
我已经使用过 quartz 很多次了。每次我这样做都是一场噩梦。据我所知,并且我已经修复了 Apple 发送项目作为崩溃证据的错误,以下 4 件事之一是正确的:
我曾经创建了一个简单的项目来证明这一点。该项目有一个按钮。每次按下按钮时,屏幕上都会添加一个小图像(100x100 像素)。该图像由两层组成,即图像本身和包含围绕图像边框绘制的虚线的附加层。这张图是用 Quartz 完成的。按 8 次按钮导致应用程序崩溃。你可以说:按8次按钮,屏幕上添加了16张图片,这就是崩溃的原因吧?
我决定在 PNG 上预绘制边框,然后将其作为图层添加到对象中,而不是使用 Quartz 绘制边框。每个创建的对象都有相同的两个层。对吗?
我点击了 100 次,向屏幕添加了 200 张图像,没有崩溃。内存从未超过 800 Kb。我可以继续点击...该应用程序继续变得更加敏捷和快速。没有内存警告,没有崩溃。
Apple 必须紧急审查 Quartz。
关于iPhone - UIImage 泄漏、CGBitmapContextCreateImage 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1427478/
这行代码使用了 Quartz 框架中的 CGBitmapContextCreateImage,造成了严重的内存泄漏: CGImageRef imgRef = CGBitmapContextCreat
我有一个上下文,我在上面进行了一些绘图。现在我想保存结果。由于反转上下文 y 轴首先我想翻转所有内容,然后创建图像: // 1. Flip Y CGContextTranslateCTM(contex
我在我的控制台中收到这样的错误: :CGBitmapContextCreate:无效数据字节/行:对于 8 个整数位/分量、3 个分量、kCGImageAlphaPremultipliedFirst,
还有人遇到过这个问题吗?我经常使用 NSTimer 调整图像大小。使用 Instruments 后,它没有显示任何内存泄漏,但我的 objectalloc 继续攀升。它直接指向CGBitmapCont
就像这篇文章一样: iPhone - UIImage Leak, ObjectAlloc Building 我也有类似的问题。 create_bitmap_data_provider 中 malloc
好吧,我很难追踪这个内存泄漏。运行此脚本时,我没有看到任何内存泄漏,但我的 objectalloc 正在攀升。 Instruments 指向 CGBitmapContextCreateImage >
我已经在这里呆了几个小时了,甚至不知道如何调试这个错误。也许有一位 SO 专家知道发生了什么。 - (void) prepareSubset { CGSize size = [image size];
我有一个使用 CGContextDrawImage 函数组合两个图像的应用程序。这是我的问题。在 iphone 5 的 ios 模拟器中,只有一个图像出现,而另一个没有出现,而在 iphone 3 的
我在我的 iPhone 应用程序中使用 CGBitmapContextCreateImage 时遇到问题。 我正在使用 AV Foundation Framework 使用此方法抓取相机帧: - (v
我目前正在开发一个应用程序,它可以一个接一个地显示许多图像。不幸的是,我没有为此使用视频的奢侈,但是,我可以选择正在使用的图像编解码器。数据从服务器发送到应用程序,已经编码。 例如,如果我使用 PNG
我是一名优秀的程序员,十分优秀!