我正在使用CGDataProviderCreateWithData函数,通过一个malloc分配的字节数组最终创建UIImage。我调用CGDataProviderCreateWithData的方式如下:
provider = CGDataProviderCreateWithData(NULL, dataPtr, dataLen, callbackFunc);
这里的dataPtr是之前为图像分配的数据字节数组,dataLen是dataPtr数组中字节的数量,callbackFunc与CGDataProviderCreateWithData文档中描述的一样:
void callbackFunc(void *info, const void *data, size_t size);
回调函数在数据提供程序释放时被调用,所以我可以在那里释放dataPtr,但我可能希望在稍后的某个阶段继续使用它(dataPtr)并最终释放它。这段代码将被多次调用,并且流程看起来像:
- malloc(dataPtr)
- 创建图像(调用CGDataProviderCreateWithData等)
- 显示图像
- 释放图像(以及由CGDataProviderCreateWithData创建的数据提供程序)
- 继续使用dataPtr
- free(dataPtr)
问题是我不能在来自CGDataProviderCreateWithData的回调中使用free(dataPtr),因为我仍然想使用它,所以我想在稍后的某个时间释放它,但我不能在不知道数据提供程序是否还需要它的情况下进行释放(据我所知,CGDataProviderCreateWithData使用我传递的数组,它不会复制)。
我无法执行上面的步骤直到确定可以安全地释放和重新分配dataPtr,因此我真正想做的是阻止等待数据提供程序被释放(好吧,我想知道是否应该重新进入1...6的代码块,而在数据提供程序被释放之前我无法这样做)。这将会发生 - 我创建数据提供程序,创建图像,立即显示它并释放数据提供程序。问题是,直到UIImage释放并完成对它的使用为止,数据提供程序才实际被释放。
我相当新于Objective-C和iOS,请问我有没有漏掉什么显而易见的东西?