2

Contexte:développement iPhone - problème de mémoire UIImageView

Inspiré de l'exemple de code d'Apple ScrollViewSuite, j'ai créé une vue classe contrôleur qui affiche des vignettes d'image et une image sélectionnée. La hiérarchie des contrôles pour l'image « sélectionnée » est quelque chose comme ceci:

--> UIView 
    --> UIScrollView 
     --> UIImageView 

code suivant est utilisé pour mettre le UIScrollView sur la vue:

imageScrollView = [[UIScrollView alloc] initWithFrame:frame]; 
[imageScrollView setBackgroundColor:[UIColor clearColor]]; 
[imageScrollView setDelegate:self]; 
[imageScrollView setBouncesZoom:YES]; 
[[self view] addSubview:imageScrollView]; 

... et le code suivant est utilisé pour configurer et ajouter UIImageView au UIScrollView:

// Custom method to return a UIImage from a URL string 
UIImage *image = [UIImage newImageWithContentsOfURL:imageURL]; 

// first remove previous image view, if any 
[[imageScrollView viewWithTag:MAIN_IMAGE_TAG] removeFromSuperview]; 

// set the new image view 
UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
[imageView setDelegate:self]; 
[imageView setTag:MAIN_IMAGE_TAG]; 
[imageScrollView addSubview:imageView]; 
[imageScrollView setContentSize:[imageView frame].size]; 

// choose minimum scale so image width fits screen 
float minScale = [imageScrollView frame].size.width/[imageView frame].size.width; 
[imageScrollView setMinimumZoomScale:minScale]; 
[imageScrollView setZoomScale:minScale]; 
[imageScrollView setContentOffset:CGPointZero]; 

// clear memory 
[imageView release]; 
imageView = nil; 

[image release]; 
image = nil; 

est ici la méthode de la catégorie que je l'ai utilisé pour obtenir l'aide UIImage chaîne URL:

+ (UIImage *)newImageWithContentsOfURL:(NSString *)imageURL { 
    NSURL *url = [[NSURL alloc] initWithString:imageURL]; 
    NSData *data = [[NSData alloc] initWithContentsOfURL:url]; 
    UIImage *image = [[UIImage alloc] initWithData:data]; 
    [data release]; 
    [url release]; 

    return image; 
} 

Problème: (approx.) L'effet de charger une image jpeg de taille 110 Kb est que la mémoire réelle de la demande passe de 12 Mo (approx.) 38 Mo (env.). J'étais déconcerté quand j'ai vu ça pour la première fois. Comment est-ce possible? Euh, et le résultat final: l'application se bloque sur iPhone 3G (occasionnellement).

Notez que les relevés de mémoire ont été effectués à l'aide de l'outil Moniteur de mémoire dans Instruments - lors du test de l'application sur le périphérique (pas sur le simulateur). Notez également que les instruments ne présentent aucune fuite de mémoire et que Static Analyzer ne signale aucun élément suspect.

J'ai besoin d'aide!

+0

Il se bloque après 1 x charge d'image 110kb dans un imageView? – Zinc

+0

Oui. 110 Ko image lorsqu'elle est chargée dans un imageView fait de la mémoire réelle tirer de 12 Mo à 38 Mo. – Mustafa

Répondre

3

Cela peut-il avoir quelque chose à voir avec le fait qu'un fichier JPEG est compressé. Il pourrait être non compressé lors de l'affichage, d'où le saut énorme dans la mémoire. Quelles sont les dimensions de l'image à l'échelle 1: 1

?

+0

Les dimensions d'origine sont 2272 × 1704 – Mustafa

+0

Je suppose que vous avez peut-être raison sur la compression et la décompression. Comment puis-je éviter cette décompression? – Mustafa

+0

C'est une énorme image à utiliser sur l'iPhone. Tu ne peux pas le redimensionner? C'est pourquoi ça prend tellement de mémoire, c'est comme une image de 3 mégapixels. – Jasarien

0

il doit sûrement être autre chose que le jpeg qui rend utiliser tant la mémoire & Crash - J'ai un .png qui est 15200x250 px et il défile magnifiquement ...