2010-03-31 58 views
0
+ (void)findAndCopyOfDatabaseIfNeeded{ 
NSArray   *path    = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString  *documentsDirectory = [path objectAtIndex:0]; 

NSFileManager *fileManager  = [NSFileManager defaultManager]; 
NSString  *databasePath  = [documentsDirectory stringByAppendingPathComponent:@"DB"]; 
BOOL success = [fileManager fileExistsAtPath:databasePath]; 
if(!success){ 
    NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"DB"]; 
    [fileManager copyItemAtPath:resourcePath toPath:databasePath error:NULL]; 
} 

NSString  *tracePath   = [documentsDirectory stringByAppendingPathComponent:@"Trace"]; 
BOOL traceDir = [fileManager fileExistsAtPath:tracePath]; 
if(!traceDir){ 
    NSString  *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Trace"]; 
    [fileManager copyItemAtPath:resourcePath toPath:tracePath error:NULL]; 
} 


NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
[dateFormatter setDateFormat:@"yyyy"]; 

NSDate *today   = [[NSDate alloc]init]; 
NSString *resultYear = [dateFormatter stringFromDate:today]; 
NSString *traceYearPath = [tracePath stringByAppendingPathComponent:resultYear]; 
BOOL yearDir = [fileManager fileExistsAtPath:tracePath]; 
if (!yearDir) { 
    [fileManager createDirectoryAtPath:traceYearPath attributes:nil]; 
} 
//[resultYear  release]; ? 
//[today  release]; ? 
//[dateFormatter release]; ? 

}我有一個關於可變釋放問題在全局類

我使用的是全球一流這樣的[+(無效)findAndCopyOfDatabaseIfNeeded。 hm ,,我不知道NSArray,NSString和NSFileManager被釋放。

變量發佈還是不發佈?請給我建議。

回答

1
NSString *resultYear = [dateFormatter stringFromDate:today]; 
//[resultYear  release]; ? 

您不需要releaseresultYear。從stringFromDate:返回的對象將爲autorelease'd。

通常假設從名稱不是以「create」或「new」開頭的方法返回的對象將是autorelease'd。至少在Apple的代碼中,這是一般的Cocoa慣例,所以你也應該遵循它。

NSDate *today   = [[NSDate alloc]init]; 
//[today  release]; ? 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
//[dateFormatter release]; ? 

你需要釋放兩個todaydateFormatter,因爲你alloc「編它們。始終在您自己的代碼中將allocreleaseautorelease配對。

1

是的,還有一些: 不釋放NSArray *路徑 - 它是自動釋放的(幾乎總是由函數返回的id)。
也不釋放文件管理器 - 它是共享單件對象