2010-03-31 54 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)。
也不释放文件管理器 - 它是共享单件对象