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避免了您必须知道分隔符。我已更新答案以反映用法。要添加哪个分隔符?这取决于操作系统。要添加哪个路径组件?你必须提供这个。它是路径分隔符“后面”的内容。