2010-07-02 10 views
1

J'utilise cette fonction pour extraire une sous-chaîne, cela fonctionne, mais il y a deux fuites:mémoire SubstringToIndex fuite

-(NSString*)EstraiP:(NSString*)str ini:(NSString*)ini fin:(NSString*)fin occ:(int)occ{ 

    NSRange rstr1; 
    for(int i=0; i < occ; i++){ 
      rstr1=[str rangeOfString:fin]; 
      str=[str substringFromIndex:rstr1.location+rstr1.length]; 
    } 

    NSString* FinalStr; 
    rstr1=[str rangeOfString:ini]; 

    if(occ==0){ 
      if(rstr1.length==0) 
       return @"Non Trovato inizio"; 
      FinalStr=[str substringFromIndex:(rstr1.location + rstr1.length)] ; 
    }else{ 
      if(rstr1.length==0) 
       return @"Non Trovato inizio"; 
      FinalStr=[str substringFromIndex:rstr1.location+rstr1.length] ; 
    } 

    NSRange rstr2=[FinalStr rangeOfString:fin]; 
    if(rstr2.length==0) 
      return @"Non Trovata fine"; 
    FinalStr=[FinalStr substringToIndex:rstr2.location]; 

    return FinalStr; 
} 

Cette fuite vers les lignes de la mémoire:

str=[str substringFromIndex:rstr1.location+rstr1.length]; 

FinalStr=[FinalStr substringToIndex:rstr2.location]; 

i regardé autour mais Je n'ai rien trouvé .... Il n'y a pas d'allocation ou de retenue, donc je ne devrais pas les libérer ... quel peut être le problème? J'espère que je me suis expliqué

Merci!

+2

Qu'est-ce qui vous a dit qu'il y avait des fuites ici? –

+0

Si vous voulez vous assurer qu'une sous-chaîne n'existe pas, utilisez 'rstr1.location == NSNotFound'. – kennytm

Répondre

0

Votre boucle initiale for est susceptible de déclencher une exception. -[NSString rangeOfString:] renvoie un objet NSRange avec le champ d'emplacement défini sur NSNotFound si aucune correspondance n'a été trouvée. Dans ce cas, vous finirez par déclencher une exception lorsque vous connectez cette valeur à -substringFromIndex:.

Vous ne devez pas nommer des variables avec une première lettre majuscule. Une telle dénomination est généralement réservée aux noms de classe et rend votre code très difficile à lire. Au lieu d'utiliser aRange.location + aRange.length, vous pouvez utiliser NSMaxRange(aRange). Il compile exactement la même chose, mais c'est un peu plus lisible.

Et enfin, vous n'avez aucune fuite de mémoire. Pourquoi pensez-vous qu'il y en a un?