0

J'ai créé une catégorie NSString personnalisée qui me permet de trouver toutes les chaînes entre deux autres chaînes. Je rencontre maintenant le problème de trouver qu'il y a beaucoup de fuites de kBs de mon script. S'il vous plaît voir le code ci-dessous:Big Fuite dans Objective-C Catégorie

#import "MyStringBetween.h" 

@implementation NSString (MyStringBetween) 

-(NSArray *)mystringBetween:(NSString *)aString and:(NSString *)bString; 
{ 
    NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; 

    NSArray *firstlist = [self componentsSeparatedByString:bString]; 
    NSMutableArray *finalArray = [[NSMutableArray alloc] init]; 


    for (int y = 0; y < firstlist.count - 1 ; y++) { 
     NSString *firstObject = [firstlist objectAtIndex:y]; 
     NSMutableArray *secondlist = [firstObject componentsSeparatedByString:aString]; 
     if(secondlist.count > 1){ 

      [finalArray addObject:[secondlist objectAtIndex:secondlist.count - 1]]; 
     } 
    } 

    [autoreleasepool release]; 

    return finalArray; 
} 
@end 

Je reconnais que je ne suis pas super bien à libérer des objets, mais je l'avais cru que le NSAutoreleasePool a traité les choses pour moi.

La ligne qui fuit:

NSMutableArray *secondlist = [firstObject componentsSeparatedByString:aString]; 

libérant manuellement secondlist déclenche une exception.

Merci d'avance!

+0

http://stackoverflow.com/questions/65427/how-does-the-nsautoreleasepool-autorelease-pool-work –

+0

Btw, votre fonction retourne un tableau au lieu d'une chaîne. –

+0

Aussi, sauf si vous appelez cette méthode sur un thread sans un pool autorelease l'encapsulant, vous ne devriez pas avoir besoin de créer un nouveau pool autorelease juste pour cette méthode. Si vous l'appelez sur le fil principal, vous en avez probablement un pour vous. – Sam

Répondre

3

Non, c'est la ligne qui fuit:

NSMutableArray *secondlist = [[NSMutableArray alloc] init]; 

Et ce n'est pas grande d'une fuite (juste un tableau mutable vide). Pourtant, ne fais pas ça.

En particulier, la ligne:

secondlist = [[firstlist objectAtIndex:y] componentsSeparatedByString:aString]; 

assigne au-dessus de la référence au tableau mutable vide.

Egalement FinalArray doit être nommé finalArray.

+0

S'il vous plaît voir mon nouveau code. La même ligne de seconde liste est marquée par des instruments qui fuient. Par "grosse fuite", dans mon propre projet, il provoque une fuite de 40ko. –

+0

Ce n'est pas juste un tableau vide - les objets sont ajoutés plus tard. Il va également fuir tous ces objets puisque le tableau les retient. Et 'finalArray' doit être autoreleased aussi. – Chuck

+0

@Chuck Stylistiquement, finalArray doit absolument être libéré. Cependant, l'auteur pourrait le publier en dehors de la méthode (bien qu'ils ne le soient pas). – Sam

1

finalArray fuit. Vous devez le libérer avant de le renvoyer, mais assurez-vous de le faire avant d'attribuer le pool autorelease ou après l'avoir libéré.