Если у вас уже есть данные в объекте NSData, вы можете вместо этого использовать CGDataProviderCreateWithCFData, чтобы вам не пришлось неправильно размещать и копировать пиксели.
Если вы настаиваете на использовании массива malloc, вы можете предоставить обратный вызов, который вызывается при освобождении поставщика данных, например:
void freePixels(void *info, const void *data, size_t size) {
free((void*)data);
}
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, [data length], freePixels);