2011-04-09 3 views
2

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

+0

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 ... –

Répondre

1

Le code affiché ne fuit pas, alors voici quelques scénarios. La fuite est ailleurs, vous interprétez les résultats des fuites de manière incorrecte.

  • Il n'y a pas de fuite, vous interprétez mal les résultats des fuites.
  • Fuites est mal (je ne l'ai pas vu, mais peut-être quelque chose au sujet de votre code est confondant)

Quand vous dites

Quand je lance dans Instruments il dit il y a fuites sur les lignes de code ...

Que voulez-vous dire? Autant que je sache, les fuites ne peuvent pas et ne vous disent pas une ligne spécifique responsable d'une fuite, cela vous donne l'historique d'un objet qui a fui et vous devez décider si vous avez sur-conservé l'objet qui fuit ou sous-relâché il.

Si vous n'aviez qu'une seule ligne dans l'historique d'allocation de l'objet (la création de l'objet), votre problème serait en cours de relâchement, mais aucun des objets dans votre code posté ne comporterait un historique.

Vous pouvez afficher une capture d'écran?

+0

Bonjour, J'ai modifié le post et ajouté plus d'informations. Je pense que la fuite peut réellement venir de viewDidAppear? Aussi l'information pour les fuites est en post aussi. Merci pour votre aide – Jason