2010-12-17 87 views
1

首先,我想提前道歉,因爲不知道這一點。在這種情況下,我一直試圖解決處理內存管理問題的最佳方式。釋放NSFileManager,如果它永遠不會到達發佈消息

我有一個簡短的方法來確定文件是否應該添加到列表中。其中一個檢查需要實例化NSFileManager。因爲一些檢查可能需要很長時間,所以我想在我的任何條件失敗後立即跳出來。但是,如果我早點返回,我的NSFileManager實例永遠不會收到它的發佈消息。

我想過使用AutoReleasePool,但是因爲添加到autoreleasepools的對象在當前運行循環結束時纔會被釋放,並且我的程序每次運行循環都會查看數千個文件,所以我不喜歡讓它們離開它們全部分配到循環結束。

如何確保我的NSFileManager的每個實例都能正確釋放。任何建議感激。

謝謝!

 
- (BOOL) fileShouldBeAdded:(NSString *)filePath { 
BOOL fileShouldBeAdded = TRUE; 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 
if ([[filePath lastPathComponent] containsString:@"test.txt"]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
if (![fileManager backupRequiredForPath:filePath]) { 
    fileShouldBeAdded = FALSE; 
    return fileShouldBeAdded; 
} 
[fileManager release]; 
return fileShouldBeAdded; 
} 
+0

無論如何,您將FileManager的實例始終保留在內存中,因此無論您是否使用自動釋放實例,都沒有區別。 autoreleased實例真的是你想要的。 – 2010-12-17 14:43:12

回答

3

重構函數,以便在外部方法中管理內存,並且如果在內部例如

-(BOOL) checkFile: (NSFileManager*) fileManager withPath:(NSString *)filePath 
{ 
if ([[filePath lastPathComponent] containsString:@"test.txt"]) { 
    return FALSE; 
} 
if (![fileManager xAttrFileAtPathShouldBeAdded:filePath]) { 
    return FALSE; 
} 
if ([[BackupManager sharedInstance] isExcludedByUser:filePath]) { 
    return FALSE; 
} 
if (![fileManager backupRequiredForPath:filePath]) { 
    return FALSE; 
} 
} 

- (BOOL) fileShouldBeAdded:(NSString *)filePath { 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 

BOOL fileShouldBeAdded = [self checkFile:fileManager withPath:filePath]; 
[fileManager release]; 
return fileShouldBeAdded; 
} 
+0

一種方法,但更好的解決方案是完全避免分配流量。 – bbum 2010-12-17 22:24:11

+0

正確 - 在循環之前分配fileManager並將其作爲參數傳遞給這些函數 - 我想先展示解決問題的方法 – Mark 2010-12-18 16:27:11

2

既然你說這就是所謂的數千倍,你是好得多分配NSFileManager外循環 - 使用整個循環,同樣的實例,然後 - 比如,爲一個實例變量。

如果您願意,您可以將它作爲參數傳遞給Mark的解決方案。

瞬時分配流量可能會極大地損害性能。但是,當然,除非它非常方便或者你已經測量了一個問題,否則不要煩惱。

相關問題