2015-12-12 3 views
-1

J'ai créé une méthode pour redimensionner une image. Quand il redimensionne une image dans le tableau d'images, cela devient trop de mémoires (par exemple 200MB ~ 300MB) en particulier lorsqu'une image est une image de haute qualité (iPhone6 ​​/ 6s). Mon projet est en ARC. Si je veux le faire, comment dois-je le coder? S'il vous plaît apprenez-moi comment "immédiatement" ou "forcé" de sortie "trimmedImage" instance. Je trouve cela par Instruments (CGImage mange beaucoup de mémoire). J'ai essayé d'utiliser @autoreleasepool, trimmedImage = nil; et [trimmedImage release] ;, mais ils fonctionnent également mal (pas de mémoire trimmedImage).Libération de la mémoire lors du redimensionnement de UIImage dans la phrase

+ (void)cropImages: (NSArray *)images { 
    for (__weak UIImage *image in images) { 
     UIImage *resizedImage = [self cropRectImage:image]; 
    } 
} 


+ (UIImage *)cropRectImage: (UIImage *)image { 
    float w = image.size.width; 
    float h = image.size.height; 
    CGRect rect; 

    if (h <= w) { 
     float x = w/2 - h/2; 
     float y = 0; 
     rect = CGRectMake(x, y, h, h); 
    }else { 
     float x = 0; 
     float y = h/2 - w/2; 
     rect = CGRectMake(x, y, w, w); 
    } 

    CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, rect); 
    UIImage *trimmedImage = [UIImage imageWithCGImage:cgImage]; 

    CGSize newSize = CGSizeMake(320, 320); 
    UIGraphicsBeginImageContext(newSize); 
    UIImage *resizedImage = nil; 
    [trimmedImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; 
    // TODO: ここでAutoReleaseされるはずだが... (http://vladimir.zardina.org/2010/05/resizing-uiimage-objects/) 
    resizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    image = nil; 
    cgImage = nil; 

    return resizedImage; 
} 

Répondre

2

Vous avez une mauvaise fuite de mémoire dans votre méthode cropRectImage:. Vous ne publiez jamais cgImage.

Remplacer cette ligne:

cgImage = nil; 

avec:

CGImageRelease(cgImage); 

ARC ne fonctionne pas avec l'une des fonctions C et des références connexes.

Je vous suggère également d'exécuter Analyze sur votre projet. Dans Xcode, allez dans Project, puis Analyze.

+0

Merci beaucoup! C'est très important. Je remplace mon code (cgImage = nil) avec votre code (CGImageRelease). Mais cela ne réduit pas la mémoire de mon application. UIImage {3000, 2002} pour - phrase Roop 1 → 98,9 MB roop 2 → 148,1 MB roop 3 → 171,4 MB ... roop 6 → 280 MB (parfois accident) Est-ce que CGImageRelease libération sa mémoire immédiatement? Je veux le réduire. Avez-vous d'autres bonnes idées? – masuhara