2010-10-15 6 views
0

J'ai cette classe dans DNS.hlibérer

@interface DNS : NSObject <NSXMLParserDelegate, NSNetServiceDelegate> { 
    NSMutableArray *servsPublished; 
} 
@property(nonatomic, retain) NSMutableArray *servsPublished; 

Ensuite, dans le mise en œuvre DNS.m il y a une méthode où je le libère et je reçois l'erreur de mémoire mauvaise exec. Ceci est la méthode, il est conforme au protocole NSXMLParserDelegate

-(void) parserDidEndDocument:(NSXMLParser *)parser { 
    NSNetService *client; 
    for (NSDictionary *aService in servToPublish) { 
     client = [[NSNetService alloc] initWithDomain:@"local" 
              type:[aService objectForKey:@"serviceType"] 
              name:[aService objectForKey:@"name"] 
              port: [(NSNumber *)[aService objectForKey:@"port"] intValue]]; 

     [client setDelegate: self]; 
     [client publish]; 

     //release this service and the client 
     [aService release]; 
     //[client release]; 
    } 

    //free the array of Dictionary containing the services 
    [servToPublish release]; 
} 

Peut-être la première pensée est que est nul, mais en fait je l'utiliser dans la méthode de vérifier si est nul ou non, puis le libérer.

Cela a-t-il quelque chose à voir avec la propriété retain? THX.

+1

Libérer nil ne peut pas poser de problème - vous pouvez apparemment envoyer n'importe quel message à zéro. Pourriez-vous poster du code où vous initialisez et où vous libérez votre variable servsPublished? – Vladimir

+0

montrez le code où vous lâchez "it" –

+2

@Robot, oui, ai-je dit quelque chose de différent? – Vladimir

Répondre

0

D'abord, exécutez build et analysez. L'analyseur statique est assez bon pour signaler certains types de problèmes de gestion de la mémoire. Deuxièmement, sauf si vous êtes en dealloc, vous ne voulez probablement pas appeler directement la version sur servsPublished. Au lieu de cela, utilisez self.servsPublished = nil. Cela libérera correctement l'objet et mettra l'ivar correspondant à zéro.

1

NE PAS libérer aService dans la boucle for. Vous ne les avez pas créés ici (pas d'allocation/nouvelle/copie) donc vous ne devriez pas les libérer. Lorsque vous publiez servToPublish, tout le contenu sera automatiquement publié, mais si vous le relâchez dans votre boucle, vous risquez d'envoyer trop de messages de version.

Il est correct de publier client dans ce cas comme vous l'allouez.