2013-02-26 41 views
0

我只是wroted这一行:使用实例方法,而不是初始化

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

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

其次在createDirectoryAtURL我只是在地方

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

同样的问题上面创建NSURL URL参数:这是编程的好方法,或者我应该在该行之前创建这样的对象,只是把对象这里?

回答

1

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

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

另外,不要把它当作进攻,但我相信你在错误的地方问这个问题。基本的内存管理问题应该要求一本好书,像Aaron Hillegass的“Cocoa programming for Mac OS X”。

+0

感谢您的帮助!相信我,昨天我订购了来自亚马逊的Stephen G. Kochan的“Programming in Objective-c,5th edition”。 – lvp 2013-02-26 12:20:33

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具有共享管理器(已经创建并intialized对象)

NSFileManager* fileManager = [NSFileManager defaultManager]; 

但在文件警告:

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

+0

谢谢!结果我使用了共享管理器。 – lvp 2013-02-26 12:32:52

相关问题