Objective c 这是在循环中创建/销毁字符串的正确方法吗?
我只是好奇这是否是实现此目的的方法,只是想确保它不会泄漏,尽管我认为我只是在修改字符串内容Objective c 这是在循环中创建/销毁字符串的正确方法吗?,objective-c,cocoa,Objective C,Cocoa,我只是好奇这是否是实现此目的的方法,只是想确保它不会泄漏,尽管我认为我只是在修改字符串内容 NSMutableString *newPath = [[NSMutableString alloc] init]; for(fileName in [manager enumeratorAtPath:rootPath]){ if ([[fileName pathExtension] isEqual:@"exr"]) { [fileArray addObject:fileName
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];
加里从泄漏角度看,这看起来不错。如果您运行的是Xcode 3.2,您可以通过Build->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);
}
}
未提及但很重要:这将进入循环。谢谢,来自过程编程,我总是对按需声明变量有点谨慎(即不是在块的开头),我想我只需要更灵活一点,对客观事实有更开放的看法,在尽可能封闭的范围内(即最接近使用它们的位置)声明变量有很好的理由。您确实应该使用
NSString
上的路径特定方法来处理路径。否则,如果目录有或没有尾随“/”
,以及其他一些角落情况,您可能会遇到麻烦。查看NSString
的文档以及“使用路径”任务组下的方法。作为奖励,您可以编写更少的代码;为了测试在结尾添加“/”的效果,但我似乎无法让它正常工作……stringByAppendingPathComponent避免了您必须知道分隔符。我已更新答案以反映用法。要添加哪个分隔符?这取决于操作系统。要添加哪个路径组件?你必须提供这个。它是路径分隔符“后面”的内容。