Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSData内存泄漏_Iphone_Memory Leaks_Nsdata - Fatal编程技术网

Iphone NSData内存泄漏

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)

我在找不到代码来源的情况下泄露了代码。 在自动释放池中调用此函数。 我释放IplImage*image参数

当我运行ObjAlloc工具时,它告诉我“NSData*data”正在泄漏。如果我试图手动释放此函数返回的UIImage,则会出现EXC_BAD_访问错误,可能是因为此UIImage已自动释放

我有点困惑,任何提示都将不胜感激

谢谢

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;
    }