我看了所有的评论,我开始看到我应该做什么.为此我修改了我的代码(见下文)我已将newPath更改为NSString,删除了[[alloc] init]和end [release],因为它现在由系统处理.我正在使用stringByAppendingPathComponent,让它在rootPath和fileName分配给NSString之前添加一个分隔符.它确实有效,我通过静态分析仪运行它没有任何问题.
// ------------------------------------------------------------------- **
// DISC: FILEWALKER ..... (cocoa_fileWalker.m)
// DESC: List all "*.png" files in specified directory
// ------------------------------------------------------------------- **
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *fileName;
NSDictionary *attrDir;
NSError *myError;
NSNumber *fileSize;
NSFileManager *manager = [NSFileManager defaultManager];
NSString *rootPath = [@"~/Pictures/Ren/PRMan" stringByExpandingTildeInPath];
NSString *newPath;
NSLog(@"Home: %@",rootPath);
for(fileName in [manager enumeratorAtPath:rootPath]){
if ([[fileName pathExtension] isEqual:@"png"]) {
newPath = [rootPath stringByAppendingPathComponent:fileName];
attrDir = [manager attributesOfItemAtPath:newPath error:&myError];
fileSize = [attrDir objectForKey: @"NSFileSize"];
NSLog(@"File: %@ Size: %@", newPath, fileSize);
}
}
[pool drain];
return 0;
}
// ------------------------------------------------------------------- **
Run Code Online (Sandbox Code Playgroud)
加里
Pet*_*sey 15
stringByAppendingPathComponent,它有效吗?
简单.您想要追加路径组件.您将该消息发送到要附加路径组件的字符串,并传递要追加的路径组件.
路径组件不是斜线; 如果是,那么该pathComponents方法只返回一个斜杠数组.路径组件是斜杠之间的部分(尽管有一个特殊情况,在定义中描述pathComponents).
斜杠是路径分隔符.这在Cocoa中是硬编码的; 它目前(并且可能永远是)斜线.所以,如果你真的想要一个斜杠追加到一个字符串,最可能的原因是,你要追加路径分隔符,而不是一个路径组件.
Run Code Online (Sandbox Code Playgroud)[newPath setString:rootPath]; [newPath appendString:@"/"]; [newPath appendString:fileName];
fileName是您要添加的组件.使用stringByAppendingPathComponent:和传递fileName,而不是斜线.
至于你的例子是否泄漏:那么,一个对象是否会在没有被释放的情况下超出范围?这个问题的答案就是它是否是泄漏的答案.如果您不确定,请查看内存管理规则.
您不附加分隔符.您追加下一个路径组件(例如filename,dir等).这可以避免您需要知道特定系统的分隔符.
NSMutableString* mutablePath = [NSMutableString string];
NSString* fullPath = [rootPath stringByAppendingPathComponent:filename];
[mutablePath setString:fullPath]; // OK to setString: of Mutable with non-Mutable
[mutablePath appendString:someOtherString]; // This won't cause an exception
// Example to clarify on comments below
{
// This will cause a compiler warning.
// warning: incompatible Objective-C types assigning
// ‘struct NSString *’, expected ‘struct NSMutableString *’
NSMutableString* ms = [@"FOO" stringByAppendingPathComponent:@"BAR"];
}
Run Code Online (Sandbox Code Playgroud)
所有现有的答案都泄漏了原始testPath字符串.对于像这样简单的事情,为什么没有人推荐-[NSMutableString appendString:]intead?
[testPath appendString:@"/"];
Run Code Online (Sandbox Code Playgroud)
没有相当于-stringByAppendingPathComponent:NSMutableString,但看起来他只是想尝试添加斜杠,而不是路径组件.如果您真的想添加路径组件,可以这样做:
[testPath setString:[testPath stringByAppendingPathComponent:@"..."]];
Run Code Online (Sandbox Code Playgroud)
这是一个令人烦恼的解决方法,但正如@dreamlax指出的那样-stringByAppendingPathComponent:,即使在NSMutableString对象上调用时,也总是返回一个不可变的字符串.:-(