【问题标题】:I have a question about variable release in global class我对全局类中的变量释放有疑问
【发布时间】:2010-03-31 20:48:55
【问题描述】:
+ (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];  ?

}

我正在使用这样的全局类 [ + (void)findAndCopyOfDatabaseIfNeeded ]。 嗯,不知道 NSArray、NSString 和 NSFileManager 发布了。

变量发布还是不发布?请给我建议。

【问题讨论】:

    标签: iphone release global


    【解决方案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'ed 他们。在您自己的代码中始终将allocreleaseautorelease 配对。

    【讨论】:

      【解决方案2】:

      是的,还有更多: 不要释放 NSArray * 路径 - 它是自动释放的(几乎总是函数返回的 id)。
      也不要释放 fileManager - 它是共享单例对象

      【讨论】:

        猜你喜欢
        • 2013-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        相关资源
        最近更新 更多