I was looking for a solution to solve the below problem, but could not find. I made a filtering method to change HSV UIImage values. This method works fine, but when I use this method, the used memory grows and they cannot be released. In the "Live Bytes" field in "Tools", I found the CFData (store) value of the MB pair increase for each filtering. How can I let them go? I found a similar question, but not very good for this problem. thanks.
//Objective-C - (UIImage*)addFilter:(UIImage*)img{ CGImageRef imgRef = img.CGImage; //getting size size_t width = CGImageGetWidth(imgRef); size_t height = CGImageGetHeight(imgRef); size_t bitsPerComponent = CGImageGetBitsPerComponent(imgRef); size_t bitsPerPixel = CGImageGetBitsPerPixel(imgRef); size_t bytesPerRow = CGImageGetBytesPerRow(imgRef); CGColorSpaceRef colorSpace = CGImageGetColorSpace(imgRef); CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imgRef); bool shouldInterpolate = CGImageGetShouldInterpolate(imgRef); CGColorRenderingIntent renderingIntent = CGImageGetRenderingIntent(imgRef); CGDataProviderRef dataProvider = CGImageGetDataProvider(imgRef); CFMutableDataRef *data = CGDataProviderCopyData(dataProvider); UInt8 *buf = (UInt8 *)CFDataGetMutableBytePtr(data); double h,s,v; double c; double cmax,cmin; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { ///////////////////// ///change HSV value// ///////////////////// } } CFDataRef filterData = CFDataCreate(NULL, buf, CFDataGetLength(data)); CGDataProviderRef filterDataProvider = CGDataProviderCreateWithCFData(filterData); CGImageRef filterCgImage = CGImageCreate( width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, filterDataProvider, NULL, shouldInterpolate, renderingIntent ); UIImage *imgFinal = [UIImage imageWithCGImage:filterCgImage]; CFRelease(filterData); CGImageRelease(filterCgImage); CGDataProviderRelease(filterDataProvider); CFRelease(data); return imgFinal; }
source share