2009-08-18 6 views
1

Je travaille toujours sur mon problème de fuites et je ne sais pas comment résoudre ce que j'ai des fuites sur chaque ligne arrayTmp addObjectchasse vers le bas Fuites

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


[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"Value 1", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"Value 2", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"Value 3", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"Value 4", @"name", nil]]; 
//add arrayTmp to an object to use later 
[arrayTmp release]; 
arrayTmp=nil; 

arrayTmp= [[NSMutableArray alloc] init]; 

[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"other value 1", @"name", nil]]; 
[arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"other value 2", @"name", nil]]; 
//add arrayTmp to an object to use later 
[arrayTmp release]; 
arrayTmp=nil; 
... 

Voici le code de mon filtre classe

@implementation Filter 

@synthesize label; 
@synthesize valueIndex; 
@synthesize listValue; 
@synthesize webServiceFieldName; 

-(id) initWithLabel:(NSString *)plabel AndValue:(int)pvalueIndex AndListValue:(NSMutableArray *)plistValue AndWebServiceFieldName:(NSString *)pwebServiceFieldName { 

self = [super init]; 

if (self != nil) { 
    self.label = plabel; 
    self.valueIndex = pvalueIndex; 
    self.listValue = plistValue; 
    self.webServiceFieldName = pwebServiceFieldName; 

} 
return self; 
} 

@end 
+0

Je ne vois aucune fuite. Qu'est-ce que vous utilisez qui vous dit qu'il y en a? – Chuck

+0

J'utilise l'outil de performance xCode leaks Les fuites apparaissent lorsque j'appelle ce code pour la deuxième fois – Mathieu

+0

Comment ajouter le tableauTmp à un objet pour une utilisation ultérieure? Y a-t-il du code là-bas, et si oui, qu'est-ce que c'est? Cela pourrait être la fuite ...En outre, vous n'avez pas besoin de définir à zéro. C'est sans signification. –

Répondre

-1

Ok je fait ces changements, mais j'ai encore douzaine de fuites sur ces lignes Voici un échantillon de mon code

-(id)initSearchFilters{ 
    self = [super init]; 


    if (self) { 

    //init the search filters array 
    self.searchFilters = [[NSMutableArray alloc] init]; 
    SearchCriteria *searchCriteriaTmp; 
    Filter *filterTmp1; 
    Filter *filterTmp2; 
    NSMutableArray *arrayTmp= [[NSMutableArray alloc] init]; 

    //Price Range 
    arrayTmp = [[NSMutableArray alloc] init]; 

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"any", @"value", @"any", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"100", @"value", @"$100", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"200", @"value", @"$200", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"300", @"value", @"$300", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"400", @"value", @"$400", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"500", @"value", @"$500", @"name", nil]]; 


    filterTmp1 = [[Filter alloc] initWithLabel:@"Minimum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_min"]; 
    filterTmp2 = [[Filter alloc] initWithLabel:@"Maximum Price" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"price_max"]; 
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:filterTmp2 AndLabelSearchCriteria:@"Price Range" AndEnabled:NO]; 
    [self.searchFilters addObject:searchCriteriaTmp]; 
    [arrayTmp release]; 
    arrayTmp=nil; 
    [filterTmp1 release]; 
    filterTmp1=nil; 
    [filterTmp2 release]; 
    filterTmp2=nil; 
    [searchCriteriaTmp release]; 
    searchCriteriaTmp=nil; 

    //Item 
    arrayTmp = [[NSMutableArray alloc] init]; 

    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"1", @"value", @"item 1", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"2", @"value", @"item 2", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"3", @"value", @"item 3", @"name", nil]]; 
    [arrayTmp addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"4", @"value", @"item 4", @"name", nil]]; 

    filterTmp1 = [[Filter alloc] initWithLabel:@"Item" AndValue:0 AndListValue:arrayTmp AndWebServiceFieldName:@"item"]; 
    searchCriteriaTmp = [[SearchCriteria alloc] initWithFilter1:filterTmp1 AndFilter2:nil AndLabelSearchCriteria:@"Item" AndEnabled:NO]; 
    [self.searchFilters addObject:searchCriteriaTmp]; 
    [arrayTmp release]; 
    arrayTmp=nil; 
    [filterTmp1 release]; 
    filterTmp1=nil; 
    [searchCriteriaTmp release]; 
    searchCriteriaTmp=nil; 
    } 
    return self; 
} 

Et mes critères de recherche classe

-(id)initWithFilter1:(Filter *)pFilter1 AndFilter2:(Filter *)pFilter2 AndLabelSearchCriteria:(NSString *)pLabelSearchCriteria AndEnabled:(BOOL)pEnabled{ 

self = [super init]; 

if (self != nil) { 
    self.filter1 = pFilter1; 
    self.filter2 = pFilter2; 
    self.labelSearchCriteria = pLabelSearchCriteria; 
    self.enabled =pEnabled; 
} 
return self; 
} 

- (void)dealloc 
{ 
[filter1 release]; 
[filter2 release]; 
[labelSearchCriteria release]; 
[super dealloc]; 
} 
+0

J'appelle initSearchFilters plusieurs fois donc je pense que c'est dû à la ligne self.searchFilters = [[NSMutableArray alloc] init]; Mais où puis-je placer cette ligne de sorte qu'elle ne s'appelle qu'une seule fois? – Mathieu

+0

Ok je l'ai résolu c'était dû aux plusieurs appels à initSearchFilters – Mathieu

2
//add arrayTmp to an object to use later 

cela implique que vous enfourner arrayTmp dans un objet et -retain'ing il. Le code coupé est par ailleurs correct, mais je parierais que la fuite réside dans cette méthode. Déposez le code de votre méthode (qui, btw, devrait être -initWithLabel: value: listValue: webServiceFieldName: si vous suiviez les conventions de nommage de Obj-C) qui stocke arrayTmp et le code qui le libère.

Dans Instruments, vous devriez pouvoir voir les instances de tableau utilisant l'instrument Object Alloc. En cliquant sur l'un d'entre eux, vous devriez obtenir une liste des événements allocation/retain/release/deallocation pour cette adresse. Vous pouvez voir la trace de la pile pour un événement donné en développant le volet "plus d'infos" sur le côté droit de la fenêtre (via un petit bouton en bas).

À partir du code ci-dessous, votre initialiseur définit les Ivars, y compris le passé dans tmpArray en tant que tel:

self.label = plabel; 
    self.valueIndex = pvalueIndex; 
    self.listValue = plistValue; 
    self.webServiceFieldName = pwebServiceFieldName; 

Cependant, je ne vois pas une méthode -dealloc.

En supposant que vos propriétés sont déclarées soit retain ou copy, votre dealloc devrait ressembler à:

- (void) dealloc 
{ 
    [label release]; 
    [listValue release]; 
    [webServiceFileName release]; 
    [super dealloc]; 
} 
1

Vous devez vous assurer que vous relâchiez vos variables membres synthétisées lorsque vous dealloc cet objet - il ne sera pas fait pour vous automatiquement. Par exemple:

- (void)dealloc 
{ 
    [label release]; 
    [listValue release]; 
    [webServiceFieldName release]; 

    [super dealloc]; 
} 
+0

Vous avez oublié [super dealloc]; à la fin. – bbum

+0

yep; fixé. Merci! – fbrereto

0

Dans le code ci-dessus les lignes qui allouent un SearchCriteria et appellent initSearchFilters w Le retainCount du résultat à 1. Lorsque vous ajoutez ensuite cet objet à self.searchFilters via addObject le retainCount est alors passé à 2. Vous devez alors appeler [searchCriteriaTmp release] pour remettre le retainCount à 1. Lorsque self.searchFilters est détruit le retainCount sera alors 0 et l'objet sera désalloué. Sans l'appel supplémentaire à release le retainCount sera toujours 1, et l'objet ne se libérera jamais, provoquant la fuite.

Questions connexes