2010-07-06 9 views
1

J'essaye de nettoyer mon application contre les fuites avec l'instrument de fuite. Il me montre des fuites sur XML parser (TBXML).Fuite de mémoire avec chaînes autoeleased iphone

Voici une classe que je vais créer sur l'analyse syntaxique:

@interface GraphPoint : NSObject { 
    NSString* x; 
    NSString* y; 
} 


@property (nonatomic, copy) NSString* x; 
@property (nonatomic, copy) NSString* y; 

@end 

@implementation GraphPoint 

@synthesize x, y; 

... some calculations 

- (void) dealloc 
{ 
    [x release]; 
    [y release]; 
    [super dealloc]; 
} 

@end 

Dans l'analyseur:

... // Une fois trouvé l'élément suivant:

 NSString *str; 
     GraphPoint *aPoint = [[GraphPoint alloc] init]; 

     TBXMLElement *item = [TBXML childElementNamed:kX_Item parentElement:pntItem]; 
     str = [TBXML textForElement:item]; 
     aPoint.x = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];  

     item = [TBXML childElementNamed:kY_Item parentElement:pntItem]; 
     str = [TBXML textForElement:item]; 
     aPoint.y = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 


     [points addObject:aPoint]; 
     [aPoint release]; 

L'instrument Leaks présente une fuite dans la fonction textForElement de TBXML, qui fournit une chaîne autoeleased:

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement { 
    if (nil == aXMLElement->text) return @""; 
    return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding]; 
} 

Puisque nous parlons parfois de centaines ou même de milliers de points, ces fuites deviennent énormes. Je ne peux pas comprendre pourquoi la chaîne autoreleased produit des fuites?

Des pensées?

Merci

Répondre

0

Il n'y a pas conserver/problèmes de libération dans le code affiché. La seule allocation dans textForElement: est stringWithCString:encoding: de NSString, dont je doute de fuite.

Le problème est ailleurs et ne peut pas être répondu avec l'information donnée. Êtes-vous sûr de lire correctement les résultats d'Instruments? Que dit l'analyse statique du code?

Je ne connais pas la bibliothèque TBXML, mais la ligne contenant nil == aXMLElement->text la rend un peu louche. Ce n'est pas une erreur mais une question de style: aXMLElement->text semble être une chaîne C tandis que nil est utilisé pour les objets objc.

+0

Merci, vous aviez raison, la fuite était ailleurs - le tableau, qui contenait des tableaux de points, n'était pas désalloué –