我是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之外的所有代码,并且应用程序仍然泄漏。 你们有任何想法如何发布“数据”吗?
提前谢谢你,
}
答案 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()
释放。 (与原始泄露的数据相比,这种泄漏无疑是微不足道的。)