我正在使用CGDataProviderCreateWithData(最终)从mableced字节数组创建一个UIImage。我称CGDataProviderCreateWithData这样的:使用CGDataProviderCreateWithData回调
provider = CGDataProviderCreateWithData(NULL, dataPtr, dataLen, callbackFunc);
其中
dataPtr是用于将图像数据字节的先前malloced阵列, DATALEN是dataPtr阵列中的字节数,并且如描述 callbackFunc在CGDataProviderCreateWithData文档:
void callbackFunc(void *info, const void *data, size_t size);
的回调函数是数据提供者被释放时调用,所以我可以自由()dataPtr那里,但我可能要孔蒂nue使用它(dataPtr),并在稍后阶段释放它。这个代码块会被多次调用,并且流将类似于:
- 的malloc(dataPtr)
- 创建图像(调用CGDataProviderCreateWithData等)
- 显示图像
- 释放图像(和所以发布)由CGDataProviderCreateWithData创建的数据提供商)
- 继续使用dataPtr
- 免费(dataPtr
因此1..6可以被执行多次。我不希望dataPtr挂在程序的整个执行过程中(它可能会改变大小),所以我想根据需要malloc /释放它。
的问题是,我可以从CGDataProviderCreateWithData回调不自由(dataPtr),因为我仍然想使用它,所以我想稍后释放它的一些时间 - 我不能释放它,直到我知道,数据提供者不再需要它(据我所知,CGDataProviderCreateWithData使用我传递的数组,它不需要副本)。
我不能做以上(1),直到我知道它可以释放并重新malloc dataPtr,所以我真正想要做的是阻止等待数据提供者被释放(嗯,我想知道我是否应该重新输入1..6代码块,在数据提供者被释放之前我不能这样做)。这将是 - 我创建数据提供者,创建图像并立即显示并释放数据提供者。问题在于数据提供者在UIImage发布并且完成之前并未实际发布。
我对objective-c和iOS很合适。我错过了明显的东西吗?
但是我不是已经拥有它了吗?我已拥有所有权 - 我不会让回调免费 - 我只想知道我什么时候可以免除罚款(即数据提供者完成后)。 – JeffR 2011-06-03 01:59:00
啊,但是如果我创建一个副本,那么我的应用程序的内存使用量将相应增加 - 如果这是一个大图像,我在内存中有两个数据字节副本......我不能等到数据提供程序完成它? – JeffR 2011-06-03 02:02:40
您也拥有CGDataProvider的所有权,因为您使用CGDataProviderCreateWithData创建了它,并且您负责通过CGDataProviderRelease处理它。我在回答中告诉过你如何创建一个可以与创建图像,显示器,免费数据提供程序等分开使用的图像数据副本。请问我为什么要以这种方式进行1-6步?是否存在图像处理? – TheBlack 2011-06-03 02:06:04