Dans l'une de mes applications pour iPad, je construis la db à distance en utilisant une chaîne json puis convertie en NSArray pour l'insérer dans les données de base puis je charge 600Mb d'images sur l'ipad. Tout cela est créé dans un fil d'arrière-plan provoquant dès le départ un problème de mémoire. Je reçois le problème d'emboîtement de 3 NSAutoreleasePool différents dans l'opération et libère chacun d'eux à un point commode. Je n'ai eu aucune erreur, ni fuite, ni avertissement. Je me demandais simplement si c'était une bonne façon de le faire ou si je manquais quelque chose.imbriqué NSAutoreleasePool
Voici un exemple schématique (le code réel est assez long):
- (void)main{
@try {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // first pool
[managedOC lock];
NSArray *results = [self loadEntitiesWithGroupName:@"Project" andName:@"projects"];
NSAutoreleasePool *prjPool; // second pool
for (NSDictionary *thisResult in results) {
prjPool = [[NSAutoreleasePool alloc] init];
Project *prj = [[Project alloc] initWithEntity:[NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedOC] insertIntoManagedObjectContext:self.managedOC];
prj.name = [thisResult objectForKey:@"name"];
[prj saveThumbnail:[thisResult objectForKey:@"thumbnail"]];
//Slides. Those are the images that take so mutch space.
NSArray *slides = [thisResult objectForKey:@"slides"];
NSAutoreleasePool *slidePool; // third pool
if(slides != kCFNull){
slidePool = [[NSAutoreleasePool alloc] init];
for(NSDictionary *slide in slides){
Slide *thisSlide = [[Slide alloc] initWithEntity:[NSEntityDescription entityForName:@"Slide" inManagedObjectContext:self.managedOC] insertIntoManagedObjectContext: self.managedOC];
thisSlide.path = prj.path;
[thisSlide saveFile:[slide objectForKey:@"file"]];
[prj addSlidesObject:thisSlide];
[thisSlide release];
[slidePool drain];
}
}
[prj release];
[result release];
[prjPool drain];
}
[self.managedOC unlock];
[totResult release];
[pool drain];
}
@catch (NSException * e) {
}
Où et comment vous réellement télécharger des images? – Vladimir
il est fait sur [thisSlide saveFile: [slide objectForKey: @ "fichier"]] où je crée l'UIImage à partir du fichier téléchargé puis j'utilise NSData et NSFileManager pour enregistrer sur le dossier Documents de l'application. – cescofry