2010-08-26 4 views
3

Quelle est la cause des fuites dans ce code? Je ne peux vraiment pas le comprendre. Sur ces lignes: 1: NSMutableArray * days = [[NSMutableArray alloc] init]; 2: [dic setObject: days forKey: clé]; 3: [jours addObject: valeur];Qu'est-ce qui cause des fuites de mémoire?

Toute la méthode:

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key { 
NSMutableArray * days = [dic objectForKey:key]; 
if (days == nil) { 
    NSMutableArray * days = [[NSMutableArray alloc]init]; 
    [days addObject:value]; 
    [dic setObject:days forKey:key]; 
    [days release]; 
    days = nil; 
} 
else { 
    [days addObject:value]; 
} 

}

BR // Christoffer

Répondre

1

Assurez-vous que le dic est libéré. Vous devriez NSLog retainCount avant que vous pensez que les versions finales sont et assurez-vous qu'ils sont 1 juste avant la version finale.

De même, exécutez Build and Analyze pour vous assurer que vous relâchez correctement. Construit dans Build and Analyze ne trouve pas autant de fuites que l'exécution de scan-build avec toutes les vérifications, alors regardez dans l'installation de scan-build dans Xcode.

Using an external Xcode Clang Static Analyzer binary, with additional checks

+0

Oublier le comte retenir. C'est trompeur, au mieux. Vous devez utiliser les outils de débogage de gestion de la mémoire Apple et l'analyseur statique pour détecter les causes des fuites. – JeremyP

+1

Pourquoi pensez-vous que le retainCount est trompeur? À un moment donné, lors du débogage, si vous vérifiez ce que vous pensez que la version finale est (ce dont vous avez souvent une bonne idée) - le retainCount devrait être un juste avant. Sinon, vous avez peut-être oublié une version ailleurs. –

0

Avez-vous essayé de changer le nom de la variable NSMutableArray * jours dans le cas? Ne recevez-vous pas un avertissement à cause de cela?

0

Il n'y a rien de mal à ce morceau de code particulier (autre que la redéfinition peu douteuse de jours dans le cadre intérieur). Quelque part vous retenez mais en oubliant de libérer l'objet que vous mettez dans le dictionnaire.

1

Vous devriez recevoir un avertissement au sujet de re-déclarer days. Cela peut être jeter le contrôle de fuite si vous utilisez l'analyseur statique. Méthode modifiée ci-dessous. Le plus souvent, le style de codage change avec un petit codage défensif ajouté.

-(void) addValueToDictionary: (NSMutableDictionary *) dic withValue: (NSNumber *) value forKey: (NSString *) key 
{ 
    if (nil == dic || nil == key || nil == value) return; // bail out on nil parameters 
    if (![dic objectForKey:key]) { 
     NSMutableArray * days = [[NSMutableArray alloc] init]; 
     [dic setObject:days forKey:key]; 
     [days release]; 
    } 
    [[dic objectForKey:key] addObject:value]; 
} 
0

changement d'initialisation NSMutableArray à ...

NSMutableArray * days = [NSMutableArray array];