0

我刚刚写了这一行:

BOOL directoryResult = [[NSFileManager alloc]
createDirectoryAtURL:[[NSURL alloc]
initFileURLWithPath:[self.documentsPath
stringByAppendingFormat:@"/level%d", levelCount] isDirectory:YES]
withIntermediateDirectories:NO attributes:nil error:nil];
NSLog(@"BOOL: %d", directoryResult);

我有两个问题:这种方法怎么可能正常工作?在[NSFileManager alloc]我不使用init.

为什么编译器不抱怨?里面有initcreateDirectoryAtURL吗?这是一种好的编程方式吗?

createDirectoryAtURL其次,在我正在NSURL就地创建的 URL 参数中

[[NSURL alloc] initFileURLWithPath:[self.documentsPath stringByAppendingFormat:@"/level%d", levelCount] isDirectory:YES]

与上述相同的问题:这是一种很好的编程方式还是应该在该行之前创建这样的对象并将对象放在这里?

4

2 回答 2

1

[NSFileManager defaultManager]返回文件管理器的单例实例,使用它来执行任务。这在 Cococa 中是很常见的做法。我不确定你的代码为什么能正常工作,我只能猜测这个特定的方法不使用任何内部变量,所以即使没有 init 也可以调用它(尽管你永远不应该这样做)。

至于NSURL构造,答案取决于编译选项。你用ARC吗?如果答案是“是”,则您的代码有效,否则会导致内存泄漏。总的来说,最好是创建一个对象并autorelease显式调用(非 ARC 应用程序),或者使用[NSURL fileURLWithPath:path].

另外,不要将其视为冒犯,但我相信您在错误的地方问这个问题。基本的内存管理问题应该问一本好书,比如 Aaron Hillegass 的“Mac OS X 的 Cocoa 编程”。

于 2013-02-26T12:14:46.560 回答
0

不保证在没有初始化的情况下创建的对象会正常工作。所以你应该初始化对象。文档示例:

BOOL isDir=NO;
NSArray *subpaths;
NSString *fontPath = @"/System/Library/Fonts";
NSFileManager *fileManager = [[NSFileManager alloc] init];
if ([fileManager fileExistsAtPath:fontPath isDirectory:&isDir] && isDir)
    subpaths = [fileManager subpathsAtPath:fontPath];
[fileManager release];

NSFileManager 也有一个共享管理器(已经创建和初始化的对象)

NSFileManager* fileManager = [NSFileManager defaultManager];

但是文档中有一个警告:

此方法始终返回相同的文件管理器对象。如果您计划使用文件管理器的委托来接收有关基于文件的操作完成的通知,您应该创建一个新的 NSFileManager 实例(使用 init 方法)而不是使用共享对象。

于 2013-02-26T12:17:16.480 回答