使用实例方法而不是init

时间:2013-02-26 12:02:35

标签: objective-c initialization

我只是想这一行:

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

为什么编译器不抱怨?在createDirectoryAtURL内是init吗?这是编程的好方法吗?

其次是createDirectoryAtURL的网址参数我正在创建NSURL

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

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

2 个答案:

答案 0 :(得分:1)

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

对于NSURL构造,答案取决于编译选项。你用ARC吗?如果答案为“是”,则代码有效,否则会导致内存泄漏。在generat中,最好是创建一个对象并显式调用autorelease(非ARC应用程序),或使用类[NSURL fileURLWithPath:path]等类方法。

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

答案 1 :(得分: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方法)而不是使用共享对象。