2010-04-03 48 views
1
NSArray  *path     = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory  = [path objectAtIndex:0]; 

NSString *databasePath   = [documentsDirectory stringByAppendingPathComponent:@"DB"]; 
NSString *fileName    = [newWordbookName stringByAppendingString:@".csv"]; 
NSString *fullPath    = [databasePath stringByAppendingPathComponent:fileName]; 

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:nil attributes:nil]; 

[databasePath release]; 
//[fileName release]; Error! 
//[fullPath release]; Error! 

//NSLog(@"#1 :databasePath: %d",[databasePath retainCount]); 
//NSLog(@"#1 :fileName: %d",[fileName retainCount]); 
//NSLog(@"#1 :fullPath: %d",[fullPath retainCount]); 

我使用此代碼,並要釋放的NSString * .. 所以,我宣佈文件名,FULLPATH和的NSString的databasePath。 數據庫已發佈但文件名,完整路徑未發佈。我不知道爲什麼會發生。如何釋放的NSString

我知道的NSArray會被自動釋放。但是文檔目錄autoreleased? (newWordbookName是NSString的類型)

我希望通過一個關於iPhone的內存管理文件的樣子。

回答

2

按照慣例,只有兩種情況下,當一個方法返回一個保留對象是構造即ALLOC等和對象複製的方法(在其名稱中含有副本)。

在其他情況下,目標有望被自動釋放,除非文檔中明確說明。

這是完整的內存管理文件: Cocoa Memory Management

2

你不應該調用任何在上面的代碼中的對象的release

的原因NSArrayautorelease「d道理是一樣的所有其他對象是autorelease」 D:是分配他們自己的價值觀呼籲他們autorelease他們回到之前的方法。一般情況下,如果方法中沒有「創建」或「新建」一詞,則可以假設方法返回autorelease。這是普通的可可慣例。 (儘管第三方代碼可能很笨,並且做不同的事情,所以警告程序員)。

你只有真正需要擔心的對象,你alloccopy自己;換句話說,每一個配對或alloccopyreleaseautorelease