Tomado de mi blog post aquí: http://i.ndigo.com.br/2012/01/releasing-nsurlconnection-and-its-delegate/
Se le tiene que prestar una atención especial al objeto delegado como, por NSURLConnection
, hay una consideración especial para el delegado: siempre se conserva.
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-BAJDDIDG
initWithRequest: delegar:
Consideraciones especiales: La conexión retiene delegado. Libera delegado cuando la conexión termina de cargar, falla, o se cancela.
Por lo tanto, teniendo esto en cuenta, tiene varias opciones para asegurarse de que su delegado se lanzará correctamente y trataré de explicar 2 simples.
La primera, y la más utilizada, es utilizar la misma clase que inicializa NSURLConnection como delegado.
[[NSURLConnection alloc] initWithRequest:request self];
Al hacer esto, la clase de la cuenta de retención se incrementa en 1 cuando la conexión se inicia y luego harían menos reducida en 1 después de la conexión termina de cargar, falla o se cancela, lo que no habría pérdidas de memoria.
La segunda opción, la que está tratando de hacer, es usar otro objeto para manejar todas las llamadas de conexión. Esto funciona bien también, pero necesitarás atención extra con la memoria. Una cosa simple que podría hacer para resolver su problema es inicializar la conexión con un objeto de liberación automática.
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler as an autorelease object
[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];
O se podía liberar su controlador justo después de la creación de la conexión (ya que será ya retenida por la conexión)
//creates the handler object
MyHandlerClass *handler = [[MyHandlerClass alloc] init];
//creates the connection with handler
[[NSURLConnection alloc] initWithRequest:request delegate:handler];
//releases handler object
[handler release];
Ambas formas saldrán de la propiedad de objetos controlador sólo con la conexión La clase, que liberará el objeto del controlador justo después de que termine de cargarse, falla o se cancela, una vez más, no provoca fugas de memoria.
EDIT: Al hacer cualquiera de las opciones anteriores, no tiene que preocuparse por liberar el delegado (pero aún tiene que liberar la conexión) en los métodos connection:DidFinishLoading
y connection:didFailWithError
.
sí, eso es lo que yo también pensaba, pero cuando hago eso ... obtengo el acceso del ejecutivo al mal acceso de los dioses que me golpean. –
En realidad, estoy bastante seguro de que NSURLConnection conserva el delegado (es una excepción en este sentido). – shosti
NSURLConnection retiene al delegado, verifique la documentación. –