3

Je fais un chargement paresseux d'images dans un tableau lorsque l'application a été chargée. J'ai essayé d'utiliser un NSMutableArray et un NSArray (je n'ai pas besoin de modifier le tableau une fois qu'il a été créé) mais le dernier se bloque sur moi.Chargement des images dans NSArray en utilisant les plantages initWithObjects mais pas avec NSMutableArray?

... 
[self performSelectorInBackground:@selector(loadImageArrays) withObject:nil]; 
... 

- (void)loadImageArrays { 

    NSAutoreleasePool *pool; 
    pool = [[NSAutoreleasePool alloc] init]; 
    NSString *fileName; 

    imageArray = [[NSMutableArray alloc] init]; 
    for(int i = 0; i <= x; i++) { 
     fileName = [NSString stringWithFormat:@"image_0000%d.png", i]; 
     [imageArray addObject:[UIImage imageNamed:fileName]]; 
    } 
    [pool drain]; 
} 

vs

NSAutoreleasePool *pool; 
pool = [[NSAutoreleasePool alloc] init]; 
imageArray = [[NSArray alloc] initWithObjects: 
      [UIImage imageNamed:@"image_00000.png"], 
      [UIImage imageNamed:@"image_00001.png"], 
      [UIImage imageNamed:@"image_0000X.png"], 
        nil]; 
[pool drain]; 

NSZombieEnabled = OUI me dit que [UIImage retain] a été envoyé à l'instance désalloué lorsque vous utilisez ce dernier bout de code. Les deux tableaux ont une propriété (nonatomic, retain) dans mon fichier h. Pourquoi les images ne sont-elles pas conservées par NSArray?

Répondre

3

UIImage fait partie de UIKit, qui n'est pas thread-safe. Par exemple, la méthode imageNamed: peut corrompre le dictionnaire global d'images de noms utilisé par la classe UIImage pour la mise en cache.

Vous devez utiliser Core Graphics si vous souhaitez charger des images sur un fil d'arrière-plan.

Modifier pour répondre à votre commentaire:

Vous pouvez charger des fichiers PNG avec:

CGDataProviderRef source = CGDataProviderCreateWithURL((CFURLRef)url); 
CGImageRef image = CGImageCreateWithPNGDataProvider(source, NULL, NO, kCGRenderingIntentDefault); 
CFRelease(source); 

A CGImage est un objet de base de base et peut être stocké dans un NSArray. Vous pouvez alors faire un UIImage de celui-ci (sur le thread principal, bien sûr):

[[UIImage alloc] initWithCGImage:image] 
+0

Même si je comprends la réponse, comment pourrais-je aller sur si je voulais utiliser Core Graphics pour charger les images dans un thread d'arrière-plan ? – hwaxxer

+0

Sur SO, si une réponse vous conduit à plus de questions, vous devez créer un nouveau message. –

+0

Je suis désolé. Excellente réponse, cependant. Merci beaucoup! – hwaxxer

0

Bien que je sache qu'il y a une grande différence dans les tableaux mutables et immuables, je suis moi-même en doute. Quelque chose me dit que ce n'est pas purement un problème mutable vs immuable. On dirait que votre piscine est drainée prématurément (sonne méchant). Non pas que cela devrait faire la différence, mais pourriez-vous essayer d'engendrer un nouveau fil en faisant;

[NSThread detachNewThreadSelector:@selector(loadImageArrays) toTarget:self withObject:nil]; 

Je suis curieux du résultat .. Découvrez également les extraits dans un environnement propre (i.e.: sans autre code autour). Si votre deuxième extrait de code fonctionne, vous devriez chercher ailleurs la solution.