2009-09-28 6 views
3

Juste curieux si c'est le moyen de le faire, je veux juste m'assurer qu'il ne fuit pas, même si je pense que je ne fais que modifier le contenu de la chaîne.Est-ce la bonne façon de créer/détruire une chaîne en boucle?

NSMutableString *newPath = [[NSMutableString alloc] init]; 

for(fileName in [manager enumeratorAtPath:rootPath]){ 
    if ([[fileName pathExtension] isEqual:@"exr"]) { 
     [fileArray addObject:fileName]; 

     // THIS BIT 
     [newPath setString:rootPath]; 
     [newPath appendString:@"/"]; 
     [newPath appendString:fileName]; 
     // HERE 
     attrDir = [manager attributesOfItemAtPath:newPath error:&myError]; 

     fileSize = [attrDir objectForKey: @"NSFileSize"]; 
     NSLog(@"File: /%@ Size: %@", fileName, fileSize); 
    } 
} 
[newPath release]; 

gary

Répondre

7

Cela semble bien sage fuite. Si vous utilisez Xcode 3.2, vous pouvez Construire-> Build & Analyzer pour que Clang vérifie ce genre de chose. Rappelez-vous que vous n'avez qu'à publier les éléments que vous avez alloués, nouveaux, copiés ou conservés.

Envisagez d'utiliser stringByAppendingPathComponent, plutôt que de coder en dur le séparateur de chemin @"/". NSString a un number of methods comme ceci spécifiquement pour travailler avec des chemins.

NSString* fullPath = [rootPath stringByAppendingPathComponent:fileName]; 
+0

Hmm j'ai essayé d'ajouter [Newpath stringByAppendingPathComponent: @ "/"]; pour tester l'ajout d'un "/" à la fin, mais je n'arrive pas à le faire fonctionner ... – fuzzygoat

+0

stringByAppendingPathComponent évite que vous ayez à connaître le délimiteur. J'ai mis à jour la réponse pour refléter l'utilisation. – nall

+0

merci, alors comment sait-il quoi ajouter? – fuzzygoat

1

Il n'y a rien de mal à cela, mais il pourrait être préférable d'utiliser initWithFormat et libérer:

NSString *newPath = [[NSString alloc] initWithFormat:@"%@/%@",rootPath,fileName]; 

// do your thing 

[newPath release]; 
+1

Non mentionné mais important: Cela irait à l'intérieur de la boucle. – Chuck

+0

Merci, venant de la programmation procédurale Je suis toujours un peu prudent de déclarer les variables à la demande (c'est-à-dire pas au début d'un bloc) Je suppose que je dois juste être un peu plus flexible avec une vision plus ouverte C – fuzzygoat

+2

En fait, il y a de très bonnes raisons de déclarer les variables dans la portée la plus englobante possible (c'est-à-dire la plus proche de l'endroit où elles sont utilisées). – nall

1

Il n'y a absolument rien de mal avec votre code, il est la gestion de la mémoire correcte.

Mais il peut être fait avec encore moins de code et gestion de la mémoire nécessaire:

for(fileName in [manager enumeratorAtPath:rootPath]){ 
    if ([[fileName pathExtension] isEqualToString:@"exr"]) { 
    [fileArray addObject:fileName]; 

    NSString* newPath = [rootPath stringByAppendingPathComponent:fileName]; 
    attrDir = [manager attributesOfItemAtPath:newPath error:&myError]; 

    fileSize = [attrDir objectForKey: @"NSFileSize"]; 
    NSLog(@"File: /%@ Size: %@", fileName, fileSize); 
    } 
} 
+0

Merci, très apprécié. – fuzzygoat

Questions connexes