这是在循环中创建/销毁字符串的正确方法吗?

时间:2009-09-28 19:45:07

标签: objective-c cocoa

只是好奇这是否是这样做的方法,只是想确保它没有泄漏,虽然我认为我只修改字符串内容。

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 个答案:

答案 0 :(得分:7)

这看起来很好泄漏。如果你正在运行Xcode 3.2,你可以构建 - > Build&分析器让Clang检查这类事情。

请记住,您只需要发布您分配,新增,复制或保留的内容。

考虑使用stringByAppendingPathComponent,而不是硬编码@"/"路径分隔符。 NSString有一个number of methods这样的专门用于处理路径。

NSString* fullPath = [rootPath stringByAppendingPathComponent:fileName];

答案 1 :(得分:1)

它没有任何问题,尽管使用initWithFormat和release会更好:

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

// do your thing

[newPath release];

答案 2 :(得分:1)

您的代码绝对没有问题,这是正确的内存管理。

但是可以通过更少的代码和内存管理来完成:

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