2010-10-20 12 views
18

¿Alguien sabe en qué situaciones la inicialización de un NSURLConnection devuelve nil en lugar de la conexión creada. La documentación dice que es posible, pero no especifica cuándo sucede esto.¿Cuándo NSURLConnection's initWithRequest devuelve nil

El método/mensaje en cuestión:

[[NSURLConnection alloc] initWithRequest:request delegate:self];

-

Según la referencia NSURLConnection Clase:

Valor de retorno: La conexión de URL para la solicitud de URL. Devuelve nil si no se puede inicializar una conexión. Guía

La URL Cargando Programación del sistema dice lo siguiente:

Si NSURLConnection no puede crear una conexión para la solicitud, initWithRequest: delegado: NIL.

-

Si bien es posible que este método devuelve nil, soy incapaz de llegar a una situación que desencadena esto. He probado los siguientes escenarios:

  • URLRequest con un URL vacío: connection:didFailWithError: método delegado se llama con "URL no soportado" como un error.
  • URLRequest con la URL inválida: connection:didFailWithError: se llama al método delegado con "URL incorrecta" como error.
  • URLRequest con URL inexistente: connection:didFailWithError: se llama al método de delegado con "No se pudo encontrar un servidor con el nombre de host especificado". como error
  • Solicitud válida pero no Internet: se llama al método de delegado connection:didFailWithError: con "La conexión a Internet parece estar fuera de línea". como error
  • solicitud nil: provoca un bloqueo.

El método initWithRequest devuelto un válido NSURLConnection en cada escenario (además de la última) y llama el connection:didFailWithError: con un error apropiado.

¿Alguien ha podido averiguar qué escenario causa que no se devuelva nada?

+0

¿Por qué quieres saber? Si nunca sucede, no es un problema, ¿verdad? :-) –

+0

Sucedió realmente y estoy tratando de descubrir qué lo causó. Un probador italiano lo informó ... #hint –

+0

¿Alguna actualización sobre esto? Todavía no hay una respuesta satisfactoria; ( – Klaas

Respuesta

0

Me gustaría probar todo lo anterior, excepto hacerlo en condiciones de poca memoria. IE, creo que sucederá cuando falla un malloc interno.

+0

¿Alguna sugerencia sobre cómo simular/probar esto? ¿Hay alguna manera más inteligente que simplemente asignar mucha memoria? –

1

Creo que esto también se puede utilizar cuando no puede carga, no sólo inicializar. (La alloc se realiza por separado, es donde probablemente la memoria baja te muerda) Así que (supongo) podría fallar porque no tenías una red disponible (3G/Wifi) o simplemente no se pudo conectar al servidor .En cualquier caso, utilice:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

Para obtener el fallo real.

Puede simular esto con la ausencia de una red, o incluso dándole una URL incorrecta.

+0

He probado todos los escenarios que ha mencionado, como he mencionado en la pregunta. Sin conexión de red/mala conexión de llamada deficiente: didFailWithError. Pero esa no es la pregunta, quiero saber cuándo falla la inicialización. Supongo que tendré que intentar simule una situación de memoria baja –

+0

Si devuelve nulo, no habrá devoluciones de llamada de delegado. – BTRUE

0

I cosa, esto es consecuencia si la solicitud u especificada tiene valores esenciales erróneos o no todos

+0

Vuelva a leer la pregunta, he probado esos escenarios como se menciona. –

1

supongo que la respuesta es "No". Parece que la única forma de que NSURLConnection devuelva nil está fallando en [superinicio]. ([superinicio] devolviendo nil) Pero como superclase de NSURLConnection es NSObject y NSObjects init simplemente devuelve self (nunca cero)

PD: Eso es para iOS SDK 4.0, en emulador, puede ser diferente en el dispositivo.

+0

Esto es consistente con que es un método "init *" - es conforme a la regla general para 'init' en las subclases de NSObject:" Las implementaciones de subclase de este método deben inicializar y devolver el nuevo objeto. Si no puede ser i Nializado, deberían liberar el objeto y devolver cero. " –

+0

No, he tenido que devolver nada antes. – BTRUE

0

NSURLConnection devuelve nil si no se crea dentro de un runLoop.

Cuestiones relacionadas