1

我是 ObjC 的新开发人员,正在尝试制作填充颜色应用程序。当我触摸图像时,颜色会改变,但我得到了这个功能的 merory 泄漏需要你的帮助:

-(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 之外的所有代码,并且应用程序仍然泄漏。你们知道如何发布“数据”吗?

先感谢您,

}

4

2 回答 2

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

   data = nil;
   [data release];
}

您正在向 nil 指针发送释放。

   [data release];
   data = nil;
}

这会做得更好。

编辑:问题CGDataProviderCreateWithData

当数据被释放时,你传递给的数据指针CGDataProviderCreateWithData就失效了。这是意料之中的。正确使用此函数需要您为数据分配一个缓冲区,并在提供程序释放时提供回调以释放数据。

对您来说最好的解决方案是使用CGDataProviderCreateWithCFDataFoundation 和 CoreFoundation 对象之间的免费桥接。

利用:

CGDataProvider provider = CGDataProviderCreateWithCFData( (CFDataRef) data );
于 2012-07-12T08:04:49.753 回答
0

请注意,目前调用CGDataProviderCreateWithData()or创建的数据提供者CGDataProviderCreateWithCFData()也正在泄露,应该调用CGDataProviderRelease(). (与原始泄露的数据相比,这次泄露无疑是次要的。)

于 2012-12-17T23:28:38.977 回答