Вопрос

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top