У меня есть вопрос о выпуске переменной в глобальном классе - PullRequest
0 голосов
/ 01 апреля 2010
+ (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.

Переменный выпуск или Не выпуск? пожалуйста, совет для меня.

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

да, и еще немного: не освобождайте путь NSArray * - он автоматически освобождается (почти всегда идентификатор, возвращаемый функциями).
также не выпускайте fileManager - это общий одноэлементный объект

1 голос
/ 01 апреля 2010
NSString *resultYear    = [dateFormatter stringFromDate:today];
//[resultYear     release];  ?

Вам не нужно release resultYear. Объект, возвращаемый из stringFromDate:, будет autorelease 'd.

Обычно можно предположить, что объекты, возвращаемые из методов, имена которых не начинаются с "create" или "new", будут autorelease 'd. По крайней мере, с кодом Apple, но это соглашение для Какао в целом, поэтому вы также должны следовать ему.

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

Вам нужно освободить today и dateFormatter, поскольку вы alloc их редактировали. Всегда соединяйте alloc с release или autorelease в своем собственном коде.

...