J'ai travaillé sur du code qui obtient les pixels d'une image, les modifie et retourne une image. Quand je l'exécute dans Instruments, il dit qu'il y a des fuites sur les lignes de code qui sont marquées d'un ★. Le code suivant renvoie juste les pixels originaux sans aucune modification:Fuite de mémoire avec des pixels UIImage?
CFDataRef CopyImagePixels(CGImageRef inImage) {
return CGDataProviderCopyData(CGImageGetDataProvider(inImage)); }
- (UIImage *) imagePixels:(UIImage*)imge {
CGImageRef img=imge.CGImage;
CFDataRef dataref=CopyImagePixels(img);
UInt8 *data=(UInt8 *)CFDataGetBytePtr(dataref);
int length=CFDataGetLength(dataref);
for (int i = 0; i < length; i+=4)
{
UInt8 b_pixel = data[i];
UInt8 g_pixel = data[i+1];
UInt8 r_pixel = data[i+2];
float outputRed = r_pixel;
float outputGreen = g_pixel;
float outputBlue = b_pixel;
data[i] = outputBlue;
data[i+1] = outputGreen;
data[i+2] = outputRed;
}
CFDataRef newData=CFDataCreate(NULL,data,length);★
CGDataProviderRef provider=CGDataProviderCreateWithCFData(newData);★
CGImageRef newImg=CGImageCreate(CGImageGetWidth(img),CGImageGetHeight(img),CGImageGetBitsPerComponent(img),★
CGImageGetBitsPerPixel(img),CGImageGetBytesPerRow(img),CGImageGetColorSpace(img),
CGImageGetBitmapInfo(img),provider,NULL,true,kCGRenderingIntentDefault);
UIImage*Result = [UIImage imageWithCGImage:newImg];
CGImageRelease(newImg);
CGDataProviderRelease(provider);
CFRelease(newData);
CFRelease(dataref);
return Result; }
Je ne sais pas pourquoi cela apparaît. J'ai essayé de chercher une réponse, mais aucune d'entre elles ne fonctionne.
Merci
MISE À JOUR 1 La fuite provient de cette méthode:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
ImageView.image = [oimage imagePixels:ImageView.image]; }
Et oimage est défini ici:
-(void)viewDidAppear:(BOOL)animated {
mainDelegate = (PhotoAppDelegate *)[[UIApplication sharedApplication]delegate];
CGSize size = mainDelegate.CurrentImage.size;
UIGraphicsBeginImageContext(size);
[mainDelegate.CurrentImage drawInRect:CGRectMake(0,0,size.width ,size.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();//LEAK
UIGraphicsEndImageContext();
int kMaxResolution = 300;
CGImageRef imgRef = newImage.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGRect bounds = CGRectMake(0, 0, width, height);
if (width > kMaxResolution || height > kMaxResolution) {
CGFloat ratio = width/height;
if (ratio > 1) {
bounds.size.width = kMaxResolution;
bounds.size.height = bounds.size.width/ratio;
}
else {
bounds.size.height = kMaxResolution;
bounds.size.width = bounds.size.height * ratio;
}
}
CGSize newsize = CGSizeMake(bounds.size.width, bounds.size.height);
UIGraphicsBeginImageContext(newsize);
[newImage drawInRect:CGRectMake(0, 0, newsize.width, newsize.height)];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
oimage = [newImage retain];
ImageView.image = oimage; }
En outre, dans la barre latérale droite de Instruments, en cliquant sur un objet pour une fuite dans la fenêtre centrale inférieure vous montrera dans la barre latérale où le li nk vient de votre code.
Merci à l'avance
Est-il possible que l'UIImage que vous retournez fuie d'une façon ou d'une autre? Retiré quelque part et se perdre et ne jamais partir? Cela entraînerait une fuite des données du fournisseur sous-jacent, mais vous penseriez que les fuites signaleraient également la fuite UIImage dans ce cas ... –