2013-02-26 40 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

相關問題