executeSelector: afterDelay: без сохранения цели? - PullRequest
5 голосов
/ 16 января 2012

У меня есть класс, который использует NSURLConnection, чтобы открыть длительное соединение с сервером. Когда соединение закрыто, либо в connectionDidFinishLoading:, либо в connection: didFailWithError:, я хочу подождать 15 секунд, а затем повторить попытку подключения.

В данный момент я использую [self performSelector:@selector(restartConection) withObject:nil afterDelay:15.0];, но это приводит к нежелательной ситуации, когда когда объект освобождается его создателем, executeSelector и NSURLConnections постоянно сохраняют себя, и он никогда не освобождается.

Как я могу сделать это без постоянного удержания объекта? Любая помощь будет высоко ценится.

Спасибо, -Алек

Ответы [ 2 ]

5 голосов
/ 16 января 2012

Вы не можете избежать удержания объекта. Он сохраняется для того, чтобы уберечь вас от неприятных сбоев, когда в следующем цикле основного цикла среда выполнения вызовет ваш селектор для освобожденного объекта.

Если вы действительно настаиваете на немедленном освобождении вашего объекта, не дожидаясь отложенного селектора, я бы предложил вам создать отдельный прокси-класс. Скажем, ваш класс называется A, создайте прокси-класс B, который будет иметь слабую ссылку на ваш класс A (то есть __weak A* a) и restartConnection селектор, который проверит, слабый ли ссылка действительна. Если это так, это вызовет restartConnection на вашем A объекте. Затем, конечно, сделайте отложенный селектор на B s restartConnection

Но, прежде всего, я бы действительно предложил вам пересмотреть, действительно ли вы не можете жить с удержанием.

5 голосов
/ 16 января 2012

Я думаю, что ваш единственный вариант - отправить

[NSTimer cancelPreviousPerformRequestsWithTarget: object];

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

...