performSelector: afterDelay: sin retener el destino?

Tengo una class que utiliza NSURLConnection para abrir una connection de larga duración a un server. Cuando la connection está cerrada, ya sea en connectionDidFinishLoading: o connection: didFailWithError :, quiero esperar 15 segundos y volver a intentar la connection.

En este momento estoy usando [self performSelector:@selector(restartConection) withObject:nil afterDelay:15.0]; , pero esto lleva a la situación no deseada de que cuando el creador libera el object, performSelector y NSURLConnections conservan perpetuamente 'self', y nunca se desasigna.

¿Cómo puedo hacer esto sin retener perpetuamente el object? Cualquier ayuda sería muy apreciada.

Gracias, -Alec

No puedes evitar retener el object. Se conserva para salvarte de feos choques cuando en el próximo ciclo de ciclo principal el time de ejecución va a llamar a tu selector en el object liberado.

Si realmente insiste en que su object se libere inmediatamente sin esperar su selector diferido, le sugeriría que cree una class de proxy por separado. Digamos que su class se llama A , cree una class de proxy B que tendrá una reference débil a su class A (es decir, __weak A* a ) y restartConnection selector de restartConnection que verificará si la reference débil es válida. De ser así, invocaría restartConnection en su object A Entonces, haga, por supuesto, un selector retrasado en la restartConnection

Pero antes de nada, realmente sugiero que reevalúe si realmente no puede vivir con el retén.

Creo que tu única opción es enviar

 [NSTimer cancelPreviousPerformRequestsWithTarget: object]; 

En algún momento, probablemente, antes de soltar el object. Si el cronómetro no se ha progtwigdo, no funciona, pero no es gratis.