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.
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} –
La méthode dealloc est-elle appelée? –
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 –