2010-11-08 7 views
0

Je suis confronté à un problème qui me rend fou. J'ai regardé d'autres forums et mon code semble être correct, mais il échoue lors de l'appel de la méthode addObject pour NSMutableArray. Je suis une simple classe de mise en œuvre de l'analyseur XML et stocker certaines informations dans un NSMutableArray:addObject pour NSMutableArray se bloque!

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
     if([elementName isEqualToString:@"Image"]){ 
      [images setObject: [[imageFile copy] autorelease] forKey: [NSNumber numberWithInt: imageId]]; 
      return; 
     } 

     if([elementName isEqualToString:@"Annotation"]){ 
      //Here create the annotation object 
      Annotation *newAnnot = [[Annotation alloc] init]; 
      newAnnot.imageId = imageId; 
      newAnnot.annDescription = [[annDescription copy] autorelease]; 
      newAnnot.annLocation = [[annLocation copy] autorelease]; 
      [annotations addObject: newAnnot]; 
      [newAnnot release]; 
      return; 
     } 

    if([elementName isEqualToString: @"Patient"] || [elementName isEqualToString: @"Images"] || [elementName isEqualToString: @"Annotations"]){ 
     [currentSection setString: @""]; 
    }else { 
     [currentElement setString: @""]; 
    } 


} 

[annotations addObject: newAnnot] fait la demande pour recevoir un signal SIGABRT!

2010-11-08 17:15:00.786 Touches[1430:207] *** -[NSCFDictionary addObject:]: unrecognized selector sent to instance 0x4b1bb50 2010-11-08 17:15:00.788 Touches[1430:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFDictionary addObject:]: unrecognized selector sent to instance 0x4b1bb50' 2010-11-08 17:15:00.789 Touches[1430:207] Stack: (
    42174544, 
    43332396, 
    42183259, 
    41645686, 
    41642482, 
    18858, 
    39384333, 
    70873863, 
    70897681, 
    39381417, 
    17100, 
    8863, 
    2234926, 
    38538931, 
    38537114, 
    2234111, 
    38538931, 
    38544407, 
    38545466, 
    38538931, 
    38537114, 
    2230794, 
    2239193, 
    103026, 
    108372, 
    134462, 
    115959, 
    147928, 
    44216700, 
    41453724, 
    41449640, 
    107041, 
    140146, 
    8296) terminate called after throwing an instance of 'NSException' Program received signal: “SIGABRT”. (gdb) continue Program received signal: “SIGABRT”. 

Voici une brève description du code:

Annotation est une simple classe dérivée de NSObject. J'applique des méthodes init et dealloc. Le premier ne fait rien, juste retourne « soi » alors que dealloc invoque parent et libère les 2 chaînes

@interface Annotation : NSObject { 
    int imageId; 
    NSString *annDescription; 
    NSString *annLocation; 
} 

@property (nonatomic, assign) int imageId; 
@property (nonatomic, retain) NSString *annDescription; 
@property (nonatomic, retain) NSString *annLocation; 

Rien étrange que ici. Alors jetez un oeil à la classe qui implémente l'analyse syntaxique:

@interface PatientBundle : NSObject <NSXMLParserDelegate> { 
    //............ 
    NSMutableArray *annotations; 
    //............. 
} 
@property (nonatomic, retain) NSMutableArray *annotations; 

Ma méthode init ressemble à ceci:

- (id) initFromFile: (NSString*)pathToFile{ 
    //..... 
    annotations = [[NSMutableArray alloc] initWithCapacity: 10]; 
    [addressParser setDelegate:self]; 
    //...... 
} 

Debugging suggère l'objet que je suis d'ajouter dans le tableau « annotations » n'est pas nul, mais Je suis incapable d'insérer même le premier. Pourquoi ai-je une exception NSInvalidArgumentException? Pourquoi NSCFDictionary: addObject si mon tableau est de classe NSMutableArray? Est-ce que quelque chose à propos de l'utilisation de NSMutableArray est manquant?

Mes coordonnées plate-forme: - Exécution iPhone Simulator Version 4.1 (225) - SDK Base et cible de déploiement: iOSDevice 4.1 (cible IPAD) - GCC 4.2

Un indice sera bien voulu appréciée. Merci d'avance.

Luis

+5

Ce qui se passe n'est pas visible depuis le code que vous avez posté. D'une certaine manière 'annotations' est un NSDictionary au lieu d'un tableau; le pointeur est probablement écrasé. –

+0

Votre propriété annotations est en lecture/écriture, pas en lecture seule, comme je l'attendrais pour un mutableArray créé dans l'init de la classe. Pourquoi? Peut-être que vous appelez accidentellement le setter quelque part? –

Répondre

2

Unrecognized selector sent to <blah> signifie presque toujours que l'objet en question a été libéré, et un autre objet (d'un autre type) a ensuite été affecté en utilisant le même système de stockage.

Pour suivre cela, regardez dans setting NSZombieEnabled, qui conserve tous les objets libérés en tant que "zombies" au lieu de libérer réellement la mémoire.

0

Le commentaire de John mérite d'être examiné. Effectuez une recherche à l'échelle du projet pour toutes les occurrences d'annotations. En outre, utilisez le débogueur pour vous assurer que la ligne sur laquelle vous pensez qu'il s'arrête est vraiment la bonne.

En outre: J'ai eu un comportement étrange dans mes applications lorsque je me réfère à une propriété P comme plaine P au lieu de self.P. Je pense que vous devriez passer par votre code et faire ce changement.

Juste vu le commentaire de David, qui je pense est relié à mon commentaire. Plain P ne fait pas la retenue; self.P fait. Fixez ceci et vos problèmes peuvent être terminés.

2

L'erreur indique que l'objet que vous envoyez addObject: to est un NSDictionary. (Rappelez-vous que la classe réelle d'un objet peut différer de la façon dont vous l'avez déclaré, même si les choses fonctionnent.) Cela peut arriver si vous avez un pointeur périmé - essayez NSZombieEnabled pour suivre celui-ci.

En tant que rappel, il est même possible que votre PatientBundle ne soit plus valide.