2012-01-15 3 views
4

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

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

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

Спасибо, -Alec

ответ

4

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

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

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

4

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

[NSTimer cancelPreviousPerformRequestsWithTarget: object]; 

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

Смежные вопросы