开发者

I have a question about variable release in global class

开发者 https://www.devze.com 2022-12-25 02:03 出处:网络
+ (void)findAndCopyOfDatabaseIfNeeded{ NSArray*path= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+ (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];  ?

}

I'm using global class like this [ + (void)findAndCopyOfDatabaseIfNeeded ]. hm,, I don't know NSArray, NSString and NSFileManager are released.

Variable release or Not release ? please advice for me.


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

You do not need to release resultYear. The object returned from the stringFromDate: will be autorelease'd.

It's usually safe to assume that objects returned from methods whose names do not start with "create" or "new" will be autorelease'd. At least with Apple code, but this is a convention for Cocoa in general, so you should also follow it.

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

You need to release both today and dateFormatter, since you alloc'ed them. Always pair an alloc with a release or autorelease in your own code.


yes, and some more: do not release NSArray * path - it is autoreleased (almost always id returned by functions are).
also do not release fileManager - it is shared singleton object

0

精彩评论

暂无评论...
验证码 换一张
取 消