Iphone NSData内存泄漏
我在找不到代码来源的情况下泄露了代码。 在自动释放池中调用此函数。 我释放IplImage*image参数 当我运行ObjAlloc工具时,它告诉我“NSData*data”正在泄漏。如果我试图手动释放此函数返回的UIImage,则会出现EXC_BAD_访问错误,可能是因为此UIImage已自动释放 我有点困惑,任何提示都将不胜感激 谢谢Iphone NSData内存泄漏,iphone,memory-leaks,nsdata,Iphone,Memory Leaks,Nsdata,我在找不到代码来源的情况下泄露了代码。 在自动释放池中调用此函数。 我释放IplImage*image参数 当我运行ObjAlloc工具时,它告诉我“NSData*data”正在泄漏。如果我试图手动释放此函数返回的UIImage,则会出现EXC_BAD_访问错误,可能是因为此UIImage已自动释放 我有点困惑,任何提示都将不胜感激 谢谢 UIImage *UIImageFromIplImage(IplImage *image) { NSLog(@"IplImage (%d, %d)
UIImage *UIImageFromIplImage(IplImage *image)
{
NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
CGImageRef imageRef = CGImageCreate(image->width, image->height,
image->depth, image->depth * image->nChannels, image->widthStep,
colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
provider, NULL, false, kCGRenderingIntentDefault);
UIImage *ret = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return ret;
}
代码对我来说很好。也许您可以尝试验证这是否是真正的泄漏,比如在循环中运行代码以查看内存使用是否增加?谢谢您的回答。你很好,这个特定的代码不会泄漏 泄漏的原因是返回的此UIImage被设置为UIImageView的此映像。但是我没有发布这个UIImageView,因为我认为因为它是从nib加载的,所以会自动发布 原因可能是我要为此UIImageView保留一个属性集
@property (nonatomic, retain) UIImageView* imageView;
我应该为从nib文件创建的对象设置属性吗
谢谢
ret
是自动释放的,这就是为什么释放它会导致EXC\u坏访问。尝试在创建数据时保留数据,并在调用CGImageCreate
后释放数据。它实际上不会修复泄漏,因为它看起来不存在泄漏,但它可能会修复假阳性。此外,imageRef
保留provider
,并且它本身应该由ret
保留或复制–不要将此误认为内存泄漏。感谢您的提示,我正在检查它。从nib加载属性并不是什么神奇的事情。从nib“唤醒”对象只是创建一个实例并设置在Interface Builder中建立的所有连接。如果为连接创建了访问器,nib加载代码将使用它。就这些。这意味着,如果为图像视图声明了保留属性,则该视图归您所有,并负责将其释放。
UIImage *UIImageFromIplImage(IplImage *image)
{
NSLog(@"IplImage (%d, %d) %d bits by %d channels, %d bytes/row %s", image->width, image->height, image->depth, image->nChannels, image->widthStep, image->channelSeq);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
CGImageRef imageRef = CGImageCreate(image->width, image->height,
image->depth, image->depth * image->nChannels, image->widthStep,
colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
provider, NULL, false, kCGRenderingIntentDefault);
UIImage *ret = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return ret;
}