NSTimeInterval утечка памяти - PullRequest
       6

NSTimeInterval утечка памяти

1 голос
/ 16 января 2010

У меня странная утечка памяти с NSTimeIntervall и NSDate. Вот мой код:

NSTimeInterval interval = 60*60*[[[Config alloc] getCacheLifetime] integerValue];
NSDate *maxCacheAge = [[NSDate alloc] initWithTimeIntervalSinceNow:-interval];

if ([date compare:maxCacheAge] == NSOrderedDescending) {
    return YES;
} else {
    return NO;
}

date - это просто объект NSDate, это должно быть хорошо. Инструменты говорят мне, что «интервал» утечки, но я не совсем понимаю, как я могу выпустить не объект? Функция заканчивается после фрагмента кода, который я разместил здесь, поэтому, исходя из моего понимания, интервал должен быть автоматически отменен.

Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 16 января 2010

Возможно, это говорит о том, что на этой линии происходит утечка.

Выражение [[[Config alloc] getCacheLifetime] integerValue] - ваша проблема.

Прежде всего, вы заботитесь о создании объекта (вызывая alloc), но теряете ссылку на него перед вызовом release или autorelease, поэтому он протекает.

Кроме того, вам действительно следует вызывать метод init сразу после выделения объекта. Даже если ваш класс Config не делает ничего особенного, необходимо вызвать метод NSObject init.

Если вы замените эту строку на

Config *config = [[Config alloc] init];
NSTimeInterval interval = 60*60*[[config getCacheLifetime] integerValue];
[config release];

Эта утечка должна быть устранена.

Вы также пропускаете объект maxCacheAge. Вставка [maxCacheAge autorelease]; перед оператором if должна исправить это.

0 голосов
/ 16 января 2010

Нашли проблему, если вы столкнулись с той же проблемой, вот решение:

[[ClubzoneConfig alloc] loadConfigFile];
NSTimeInterval interval = 60*60*[[[ClubzoneConfig alloc] getCacheLifetime] integerValue];
NSDate *maxCacheAge = [[NSDate alloc] initWithTimeIntervalSinceNow:-interval];

if ([date compare:maxCacheAge] == NSOrderedDescending) {
    [maxCacheAge release];
    return YES;
} else {
    [maxCacheAge release];
    return NO;
}

Проблема в том, что объект maxCacheAge должен быть освобожден, как я владею (см. Ссылку ниже).

Я получил его благодаря замечательному решению: Управление памятью iPhone

...