Утечки NSURLConnection — почему?
-
18-09-2019 - |
Вопрос
NSURLConnection *соединение — свойство класса
@property (nonatomic, retain) NSURLConnection *connection;
Инструменты сообщают, что я пропускаю объект NSURLConnection во второй строке кода ниже.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[request release];
в didFinishLoading
и didFinishWithError
селекторы делегатов, я отключаю соединение и устанавливаю ноль
[self.connection release];
self.connection = nil;
Я прочитал «Утечка NSURLConnection?» пост и ряд других.Я чувствую, что упускаю что-то совершенно очевидное.Помощь?
Решение
Как сказано в комментарии Роу, вы выделяете соединение (сохраняете счетчик 1), а затем снова сохраняете его с помощью своего свойства соединения (сохраняете счетчик 2).Вы отпускаете только один раз в селекторах делегатов.У вас есть два варианта:
1) Измените свойство соединения, чтобы оно назначалось, а не сохранялось.
@property (nonatomic, assign) NSURLConnection *connection;
// OR, since assign is the default you may omit it
@property (nonatomic) NSURLConnection *connection;
2) Освободите выделенный объект после того, как он будет сохранен вашим свойством соединения:
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
self.connection = connection;
[connection release];
[request release];
Вариант 2 предпочтительнее, поскольку вероятность утечек меньше, поскольку выделение и освобождение расположены как можно ближе друг к другу.Кроме того, если вы забудете разорвать предыдущее соединение, синтезированные методы освободят предыдущее за вас.Не забудьте освободить self.connection в Dealloc.