2010-07-12 6 views
2

Je suis occupé avec une application iPhone. Une partie de cela, je charge 100 petites images de Flickr comme un UIButton. Le problème est de savoir comment gérer la mémoire. il charge environ 5-6 mb à chaque fois. Quand je libère la vue par le biais de navigationController popViewController la mémoire reste presque la même. Ce que je fais maintenant est de boucler toutes les images et de mettre la requête à une ASINetworkQueue. Lorsque la boucle est prête, je le fais [networkQueue go].Charger 100 UIImages

//Loop images 
for (NSDictionary* message in output) 
{ 
    NSString *imageURL = [[NSString alloc] initWithFormat:@"http://farm%@.static.flickr.com/%@/%@_%@_s.jpg", [message objectForKey:@"farm"], [message objectForKey:@"server"], [message objectForKey:@"id"], [message objectForKey:@"secret"]]; 

    if(cx > 280) { cy = cy + 78; cx = 6.0f; } 

    //user data for the request 
    NSMutableDictionary *imageInfo = [[NSMutableDictionary alloc] init]; 

    //init Image 
    CGRect myImageRect = CGRectMake(cx, cy, 72.0f, 72.0f); 
    UIButton *myImage = [[UIButton alloc] initWithFrame:myImageRect]; 
    [myImage setTag:i]; 

    [myImage setBackgroundColor:[UIColor whiteColor]]; //grayColor 
    [imageInfo setObject:[NSString stringWithFormat:@"%i", i] forKey:@"arrayNr"]; 
    [images addObject: myImage]; 
    [fotoView addSubview: myImage]; 

    //get url 
    NSURL *imageURI = [[NSURL alloc] initWithString:imageURL]; 

    //load image 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL: imageURI]; 

    [request setDownloadDestinationPath:[[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:[message objectForKey:@"id"]]]; 
    [request setUserInfo: imageInfo]; 
    [networkQueue addOperation:request]; 

    [imageURL release]; 
    [imageURI release]; 

    [myImage release]; 
    [imageInfo release]; 

    cx = cx + 78; 
    i++; 
} 

Lorsque la demande est terminée, je le faire:

- (void)imageFetchComplete:(ASIHTTPRequest *)request 
{ 
    UIImage *img = [[UIImage alloc] initWithContentsOfFile:[request downloadDestinationPath]]; 
    if (img) 
    { 
     //set image 
     UIButton *myButton = [images objectAtIndex:[[[request userInfo] objectForKey:@"arrayNr"] intValue]]; 
     [myButton setBackgroundImage:img forState: UIControlStateNormal]; 
     [myButton addTarget:self action:@selector(showImage:) forControlEvents:UIControlEventTouchUpInside]; 
    } 

    [img release]; 
} 

Et ceci est ma fonction dealloc:

- (void)dealloc 
{ 
    [networkQueue cancelAllOperations]; 
    networkQueue.delegate = nil; 
    [networkQueue release]; 

    [flickrController cancelAllOperations]; 
    flickrController.delegate = nil; 
    [flickrController release]; 

    [images release]; 
    [fotoView release]; 
    [output release]; 

    [super dealloc]; 
} 

Je ne comprends pas la façon dont la mémoire ne disparaît pas . Solution à quoi je peux penser sont: - créer un objet propre pour l'uibutton/uiimage. - Utiliser un UITableview pour gérer les images

Les deux solution Je ne vois pas comment il effacerait toute la mémoire après la fermeture de la vue. J'espère que quelqu'un me dira comment gérer ce genre de situation.

Répondre

2

Si vous le code où posté vous faites le nettoyage, il pourrait être plus clair où le problème est, mais je prends une estimation de toute façon:

Dans la méthode imageFetchComplete: vous conserviez la référence à l'image lorsque vous invoquer setBackgroundImage: Il sera donc conservé en mémoire jusqu'à ce que vous relâchiez l'objet bouton qui l'a retenu. Comme le bouton lui-même est conservé par le tableau images, vous devez également libérer ce tableau ou, dans le cas d'un tableau mutable, supprimer le bouton du tableau.

+0

J'ai mis le reste du code dans mon premier post. Ce que j'ai essayé était quelque chose comme ça à (vide) dealloc mais ça a échoué. \t pour (bouton UIButton * images) \t { \t \t [[bouton backgroundImageForState: UIControlStateNormal] release]; \t \t [bouton removeFromSuperview]; \t \t [libération de bouton]; \t} –

+1

La méthode dealloc est-elle appelée? –

+0

J'étais comme si vous posez cette question. C'est normal que dealloc soit appelé. Mais ça ne s'appelle pas. J'ai donc le problème maintenant. J'espère trouver une solution pour cela –