2010-08-11 5 views
1

J'ai eu un problème avec mon application iPad qui est, j'ai besoin de télécharger plus de 10.000 images d'un serveur à la fois. J'ai réussi à télécharger plus de 8000 images, mais après j'ai reçu une exception comme "Program received signal:" 0 " Data Formatters temporairement indisponible, va réessayer après un 'continuer'. (Erreur inconnue lors du chargement de la bibliothèque partagée"/Developer /usr/lib/libXcodeDebuggerSupport.dylib ") (gdb)" ceci dans le débogueur. J'ai testé la gestion de la mémoire. Il n'y a aucun problème dans la gestion de la mémoire. Mais j'ai quand même eu l'exception. Aidez-moi, s'il vous plaît. Merci d'avance, Sekhar Bethalam.Data Formatters temporairement indisponible

Répondre

2

formatteurs de données sont utilisés de telle sorte que le débogueur peut représenter un objet comme plus qu'un simple pointeur ou valeur entière (par exemple, formatteurs de données permettent au débogueur de vous montrer la valeur sous-jacente de NSNumber, ou les éléments à l'intérieur d'un NSArray, etc.). Parfois, — et je ne sais pas pourquoi — ils s'arrêtent juste de travailler. Dans tous les cas, le fait que les formateurs de données ne fonctionnent pas n'est pas la racine du problème.

Sans voir votre code (par exemple, comment télécharger et/ou stocker les images), il n'est pas très facile de diagnostiquer votre problème. Après quelques recherches sur Google, il apparaît que les programmes sur iPhone OS reçoivent le signal 0 lorsqu'ils utilisent trop de ressources (pas forcément de la mémoire). Il n'y a rien que vous puissiez faire pour empêcher iPhone OS de tuer votre programme quand il le veut.

Quelques questions:

  • Êtes-vous essayez de télécharger 10.000 images simultanément ou successivement? Espérons séquentiellement!
  • Même s'il n'y a aucune fuite détectée dans votre code, votre programme peut toujours utiliser trop de mémoire. Gardez-vous des références à ces images dans un tableau ou quelque chose de similaire?
  • Êtes-vous dans une boucle serrée? Votre code peut ne pas conserver de références à l'une des données/URL/images, mais le pool autorelease peut l'être. Dans les situations de boucle serrée, il est parfois conseillé de créer un nouveau pool de libération automatique au début de la boucle et de le relâcher en bas. Par exemple:

    for (NSUInteger i = 0; i < 10000; i++) 
    { 
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        // do the work to get the image. Objects are automatically added to the 
        // most recently created autorelease pool in the current thread. 
        [pool release]; 
    } 
    
1

Ceci est mon code que je l'ai mentionné ci-dessus,

for (int i = 0; i < 10000; i ++) { printf ("\ n générer des images. .............:% d ", i); i ++;

 UIImageView* imageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, spotItem.imageWidth, spotItem.imageHight)]; 
     NSData *receivedData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://sererpath/prudently/iphone/image_s/e545afbf-4e3e-442e-92f9-a7891fc3ea9f/test.png"]]; 
     imageView.image = [[UIImage alloc] initWithData:receivedData] ; 
     //imageView.image=[UIImage imageNamed:@"1.png"]; 
     [spotItem.subView addSubview:imageView]; 
     [imageView release]; 



    } 

Je les téléchargeais directement.

+1

Oui, le problème pourrait être que vous créez deux objets auto-libérés à chaque itération de la boucle (les 'NSData' et' NSURL'). Cela signifie qu'une fois votre boucle terminée, le pool autorelease contiendra au moins 20 000 éléments (et qui sait combien de mémoire ces 20 000 éléments utilisent au total!). Essayez de suivre mon conseil dans ma réponse (créer un NSAutoreleasePool au début de la boucle, et le relâcher à la fin). – dreamlax

Questions connexes