ठीक है मैं कठिनाई यह स्मृति रिसाव पर नज़र रखने की एक दुनिया हो रहा है। इस स्क्रिप्ट को चलाने पर मुझे कोई मेमोरी लीक नहीं दिखाई दे रही है, लेकिन मेरा ऑब्जेक्टॉल चढ़ रहा है। CGBitmapContextCreateImage को उपकरण अंक> create_bitmap_data_provider> malloc, इस मेरे objectalloc का 60% लेता है।iPhone - UIImage रिसाव, CGBitmapContextCreateImage रिसाव
इस कोड को एक NSTimer के साथ कई बार कहा जाता है।
//GET IMAGE FROM RESOURCE DIR
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
UIImage * blurMe = [UIImage imageWithData:imageData];
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width/dblBlurLevel, blurMe.size.width/dblBlurLevel) interpolationQuality:3.0];
UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0];
UIImage * imageCopy = [[UIImage alloc] initWithCGImage:labelImage.CGImage];
[pool drain]; // deallocates scaledImage and labelImage
imgView.image = imageCopy;
[imageCopy release];
नीचे धुंधला कार्य है। मेरा मानना है कि ऑब्जेक्टॉलोक इश्यू यहां स्थित है। शायद मुझे ताजा आंखों की एक जोड़ी चाहिए। अगर कोई इसे समझ सके तो अच्छा होगा। क्षमा करें यह बहुत लंबा है ... मैं कोशिश करूँगा और इसे छोटा कर दूंगा।
@implementation UIImage(Blur)
- (UIImage *)blurredCopy:(int)pixelRadius
{
//VARS
unsigned char *srcData, *destData, *finalData;
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
//IMAGE SIZE
size_t pixelsWide = CGImageGetWidth(self.CGImage);
size_t pixelsHigh = CGImageGetHeight(self.CGImage);
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL) { return NULL; }
bitmapData = malloc(bitmapByteCount);
if (bitmapData == NULL) { CGColorSpaceRelease(colorSpace); }
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL) { free (bitmapData); }
CGColorSpaceRelease(colorSpace);
free (bitmapData);
if (context == NULL) { return NULL; }
//PREPARE BLUR
size_t width = CGBitmapContextGetWidth(context);
size_t height = CGBitmapContextGetHeight(context);
size_t bpr = CGBitmapContextGetBytesPerRow(context);
size_t bpp = (CGBitmapContextGetBitsPerPixel(context)/8);
CGRect rect = {{0,0},{width,height}};
CGContextDrawImage(context, rect, self.CGImage);
// Now we can get a pointer to the image data associated with the bitmap
// context.
srcData = (unsigned char *)CGBitmapContextGetData (context);
if (srcData != NULL)
{
size_t dataSize = bpr * height;
finalData = malloc(dataSize);
destData = malloc(dataSize);
memcpy(finalData, srcData, dataSize);
memcpy(destData, srcData, dataSize);
int sums[5];
int i, x, y, k;
int gauss_sum=0;
int radius = pixelRadius * 2 + 1;
int *gauss_fact = malloc(radius * sizeof(int));
for (i = 0; i < pixelRadius; i++)
{
.....blah blah blah...
THIS IS JUST LONG CODE THE CREATES INT FIGURES
........blah blah blah......
}
if (gauss_fact) { free(gauss_fact); }
}
size_t bitmapByteCount2 = bpr * height;
//CREATE DATA PROVIDER
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, srcData, bitmapByteCount2, NULL);
//CREATE IMAGE
CGImageRef cgImage = CGImageCreate(
width,
height,
CGBitmapContextGetBitsPerComponent(context),
CGBitmapContextGetBitsPerPixel(context),
CGBitmapContextGetBytesPerRow(context),
CGBitmapContextGetColorSpace(context),
CGBitmapContextGetBitmapInfo(context),
dataProvider,
NULL,
true,
kCGRenderingIntentDefault
);
//RELEASE INFORMATION
CGDataProviderRelease(dataProvider);
CGContextRelease(context);
if (destData) { free(destData); }
if (finalData) { free(finalData); }
if (srcData) { free(srcData); }
UIImage *retUIImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return retUIImage;
}
केवल एक चीज मैं उस बारे में सोच सकते objectalloc को पकड़े रहा है इस UIImage * retUIImage = [UIImage imageWithCGImage: cgImage]; ... लेकिन कैसे करना है मैं जारी करने के बाद यह वापस आ गया है? उम्मीद है कि कोई मदद कर सकता है।
मैं अगर यह रिसाव से संबंधित है पता नहीं है, लेकिन आप 'मुक्त (BitmapData) नहीं बुला जाना चाहिए' आप संदर्भ जारी किया है पहले। 'Malloc() 'के साथ आवंटित स्मृति के ब्लॉक काउंटर बनाए रखते नहीं हैं, इसलिए यदि आप' फ्री() 'कहते हैं तो इसे तुरंत मुक्त कर दिया जाता है, भले ही CGContext इसका उपयोग कर रहा हो। – benzado
क्या आप आईफोन ओएस 3.1 या उच्चतर को लक्षित कर रहे हैं? यह 3.0 या पहले के ढांचे में एक बग हो सकता है। यदि आप 3.1 पर हैं, तो आपको 'CGBitmapContextCreate' के लिए बिटमैपडेटा आवंटित करने की आवश्यकता नहीं है। इसके अलावा '_imageScaledToSize' एक अनियंत्रित कॉल है। कृपया इसका इस्तेमाल न करें। यदि आप अनियंत्रित कॉल का उपयोग कर रहे हैं तो कुछ लोग आपके प्रश्न का उत्तर देने के इच्छुक नहीं हो सकते हैं। – lucius
हे bbullis21 क्या आपका ब्लर कोड डिवाइस पर ठीक काम कर रहा है ?? – Leena