Утечка памяти NSDate

Вопрос:

Я искал SO среди других форумов для ответа на этот вопрос, но, что бы я ни пытался, он, похоже, не избавился от моей утечки памяти. Есть ли у кого-нибудь предложения?

Я получаю утечку памяти по 16 байт за NSDate в моем ViewController каждый раз, когда я его представляю.

-(void)initialise:(id)sender withDate:(NSDate *)date withMinimumDate:(NSDate *)minimum {
delegate = sender;
self.originalDate = [[NSDate alloc] init];
self.originalDate = date;

self.minimumDate = [[NSDate alloc] init];
self.minimumDate = minimum;
}

- (void)dealloc {
[self.originalDate release];
[self.minimumDate release];

[super dealloc];
}

Я попытался освободить и/или сделать NSDates nil перед тем, как распределить их в первый раз, и установить их на ноль в методе dealloc.

Они объявляются как неатомные и сохраненные свойства в заголовке.

Я пропустил что-то основное здесь или есть более сложный ответ?

Лучший ответ:

Вы выполняете alloc/init NSDate для originalDate, но затем сразу же отказываетесь от него и устанавливаете его равным параметру date, возможно, утечка созданного NSDate. Вы тоже делаете это с помощью minimumDate.

Как минимум, удалите те две строки, которые выполняют alloc/init двух соответствующих объектов NSDate, которые впоследствии отказываются от параметров для метода initialise.


Кстати, эта проблема (и проблема dealloc) была бы выделена для вас, если вы использовали статический анализатор («Анализировать» в меню «Продукт» или нажмите shift + command + B):

static analyzer

При написании кода подсчета ссылок вручную статический анализатор неоценим для выявления проблем. У вас действительно должен быть чистый счет здоровья от анализатора. Вы можете щелкнуть по синим значкам, и он будет часто расширяться с описаниями и стрелками, которые я показываю в приведенном выше снимке экрана.

Обратите внимание, что это также self.originalDate на неправильное использование self.originalDate (вместо _originalDate или независимо от используемой переменной экземпляра) в вашем методе dealloc. Как я уже упоминал в своем предыдущем комментарии, вам не следует использовать методы доступа в методе dealloc.

Ответ №1

Эти две строки создают ссылки на объекты, которые никогда не выпускаются.

self.originalDate = [[NSDate alloc] init];

self.minimumDate = [[NSDate alloc] init];

Видя, как вы мгновенно перезаписываете эти свойства новыми значениями, вам просто нужно удалить эти две строки (которые избыточно NSDate объекты NSDate, которые никогда не используются), и ваша утечка должна исчезнуть.

Вы также должны проверить, правильно ли поддерживается делегирование памяти, поскольку я не вижу выпуска в dealloc для переменной-делегата.

Оцените статью
TechArks.Ru
Добавить комментарий