Обнаружена утечка памяти с помощью clang, но не удается разблокировать и происходит автозагрузка - PullRequest
0 голосов
/ 15 марта 2010

У меня есть класс, который строит запрос на основе нескольких переданных переменных. Класс также имеет все методы делегата для получения данных и сохраняет их в свойстве для вызывающего класса для извлечения.

Когда класс инициализируется, он создает соединение, а затем возвращает себя:

NSURLConnection *connection;
if (self = [super init]) {
    self.delegate = theDelegate;
    ...some code here...
    connection = [[NSURLConnection alloc] initWithRequest:theRequest  delegate:self  startImmediately:YES];
}
return self;

Так что я не могу выпустить его нормально, и если я его автоматически выпускаю, он вылетает. Это работа вызывающего класса, чтобы выпустить? И если это так, то просто освобождение инициализированного объекта также освобождает соединение, или вам нужно освободить его специально? Если да, то как бы ты?

Спасибо

Ответы [ 3 ]

3 голосов
/ 15 марта 2010

Сделать connection переменной экземпляра и освободить ее по требованию. Вопрос «кто» должен освободить объект, строго зависит от вашей семантики и иерархии объектов.

0 голосов
/ 15 марта 2010

Помните, что вы не должны полностью верить в Clang. Может сообщать о ложных негативах и ложных срабатываниях и действительно сообщать о них.

Clang становится лучше с каждым днем, но сейчас он все еще находится в зачаточном состоянии. Хорошо, что он так хорошо интегрирован с XCode, но имейте в виду, что у него есть некоторые недостатки.

В этом случае это зависит от области действия переменной, в которой вы храните объект подключения. Если он объявлен как переменная экземпляра, то все должно быть в порядке, если вы выпустите его в dealloc или в другом Точка, когда вы закончите с этим.

Если, как вы разместили в своем вопросе, объявление connection является локальным для вашего метода init, то Clang правильно сообщает об утечке. Вы должны сделать connection переменной или свойством экземпляра и убедиться, что вы освобождаете его в dealloc или по окончании работы с ним.

0 голосов
/ 15 марта 2010

Почему вы открываете NSURLConnection в конструкторе?

Как правило, ваш конструктор не должен выполнять этот тип работы. Если соединение связано с объектом, я бы сделал connection свойством объекта и [connection release]; в методе dealloc объекта.

...