Objective C-使用CGDataProviderCopyData泄漏内存

时间:2012-07-12 07:51:26

标签: objective-c nsimage cgimage cgimageref

我是ObjC的新开发人员并尝试制作填色应用。当我触摸图像时,颜色会发生变化,但是我得到了这个功能需要你的帮助:

-(void) updateImageWithColorSelected:(int) pos{
   CGImageRef imageRef = self.basicImage.CGImage;
   NSData *data = CGDataProviderCopyData(CGImagerGetDataProvider(imageRef));//leak here
   Byte *pixels = (Byte *)[data bytes];
   //change color...
   for(int i = 0; i< IMG_SIZE; i++){
     pixels[j] = 255;
   }
   CGDataProvider provider = CGDataProviderCreateWithData( NULL, pixels, [data length], NULL];
   CGImageRef newImageRef = CGImageCreate(w,h....);
   self.basicImage = [UIImage imageWithCGImage:newImageRef];
   //release newImageRef
   CGImagerRelease(newImageRef);

   // set basic image to img
   [self.img setImage:self.basicImage];

   data = nil;
   [data release];
}

我尝试删除除NSData * data = CGDataProviderCopyData之外的所有代码,并且应用程序仍然泄漏。 你们有任何想法如何发布“数据”吗?

提前谢谢你,

}

2 个答案:

答案 0 :(得分:1)

   // set basic image to img
   [self.img setImage:self.basicImage];

   data = nil;
   [data release];
}

你正在向一个零指针发送释放。

   [data release];
   data = nil;
}

这会做得更好。

编辑: CGDataProviderCreateWithData

的问题

发布数据时,传递给CGDataProviderCreateWithData的数据指针变为无效。这是预料之中的。正确使用此功能需要为数据分配缓冲区,并在发布提供程序时提供回调以释放数据。

最好的解决方案是使用CGDataProviderCreateWithCFData代替,利用Foundation和CoreFoundation对象之间的免费桥接。

使用:

CGDataProvider provider = CGDataProviderCreateWithCFData( (CFDataRef) data );

答案 1 :(得分:0)

请注意,目前通过调用CGDataProviderCreateWithData()CGDataProviderCreateWithCFData()创建的数据提供程序也会泄露,应通过调用CGDataProviderRelease()释放。 (与原始泄露的数据相比,这种泄漏无疑是微不足道的。)