2010-03-31 13 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]; ? 

}une question à propos libération variable dans la classe mondiale

J'utilise la classe mondiale comme celui-ci [+ (void) findAndCopyOfDatabaseIfNeeded]. hm ,, Je ne sais pas NSArray, NSString et NSFileManager sont publiés.

Variable release ou Not release? s'il vous plaît des conseils pour moi.

Répondre

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

Vous n'êtes pas obligé de releaseresultYear. L'objet renvoyé par le stringFromDate: sera autorelease 'd.

Il est généralement possible de supposer que les objets renvoyés par des méthodes dont le nom ne commence pas par "create" ou "new" seront autorelease 'd. Au moins avec le code d'Apple, mais c'est une convention pour le cacao en général, donc vous devriez aussi le suivre.

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

Vous devez libérer les deux today et dateFormatter, puisque vous alloc « les ed. Associez toujours un alloc avec un release ou autorelease dans votre propre code.

1

oui, et d'autres encore: ne libère pas le chemin NSArray * - il est auto-libéré (les ID retournés par les fonctions sont presque toujours).
également ne pas libérer fileManager - il est partagé objet singleton