Является ли это правильным способом создания / уничтожения строки в цикле?


Просто любопытно, если это способ сделать это, просто хочу убедиться, что он не протекает, хотя я думаю, что я только изменяю содержимое строки.

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];

Гэри

3 3

3 ответа:

Это выглядит прекрасно с точки зрения утечки. Если вы используете Xcode 3.2, вы можете построить - >Build & Analyzer, чтобы получить Clang для проверки такого рода вещей.

Помните, что вам нужно только выпустить вещи, которые вы выделяете, создаете, копируете или сохраняете.

Рассмотрите возможность использования stringByAppendingPathComponent, а не жесткого кодирования разделителя путей @"/". NSString имеет ряд методов , подобных этому, специально для работы с путями.

NSString* fullPath = [rootPath stringByAppendingPathComponent:fileName];

В этом нет ничего плохого, хотя было бы лучше использовать initWithFormat и release:

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

// do your thing

[newPath release];

В вашем коде нет абсолютно ничего плохого, это правильное управление памятью.

Но это может быть сделано с еще меньшим количеством необходимого кода и управления памятью:

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);
  }
}