我使用CGDataProviderCreateWithData(最终)从一个mallocated字节数组创建一个UIImage。我这样调用CGDataProviderCreateWithData:
provider = CGDataProviderCreateWithData(NULL, dataPtr, dataLen, callbackFunc);
哪里
dataPtr is the previously malloced array of data bytes for the image, dataLen is the number of bytes in the dataPtr array, and callbackFunc is as described in the CGDataProviderCreateWithData documentation:
void callbackFunc(void *info, const void *data, size_t size);
回调函数是在数据提供程序发布时调用的,所以我可以在那里释放()dataPtr,但我可能想继续使用它(dataPtr),并在稍后的某个阶段释放它。这段代码将被多次调用,流看起来像:
- malloc(dataPtr)
- create image (call CGDataProviderCreateWithData etc)
- display image
- release image (and so release data provider created by CGDataProviderCreateWithData)
- continue to use dataPtr
- free(dataPtr)
因此1..6可以被执行多次。我不希望dataPtr在程序的整个执行过程中一直存在(而且它的大小可能会改变),所以我想根据需要对其进行malloc/释放。
问题是,我无法在CGDataProviderCreateWithData的回调中释放(dataPtr),因为我仍然想使用它,所以我想稍后释放它——在我知道数据提供程序不再需要它之前,我无法释放它(据我所知,CGDataProvierCreateWithData使用了我传递的数组,它不需要副本)。
在我知道可以释放并重新malloc dataPtr之前,我无法执行上面的(1),所以我真正想做的是阻止等待数据提供程序被释放(好吧,我想知道我是否应该重新输入1..6代码块,在数据提供程序释放之前我无法执行此操作)。它将是-我创建数据提供程序,创建图像并立即显示它,然后释放数据提供程序。问题是,直到UIImage发布并完成它之后,数据提供程序才真正发布。
我对objective-c和iOS相当陌生。我是不是错过了一些显而易见的东西?