Является ли это правильным способом создания / уничтожения строки в цикле?
Просто любопытно, если это способ сделать это, просто хочу убедиться, что он не протекает, хотя я думаю, что я только изменяю содержимое строки.
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 ответа:
Это выглядит прекрасно с точки зрения утечки. Если вы используете 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); } }