liberar - nfc iphone 7 como activar
Hacer solicitudes GET y POST desde una aplicaciĆ³n de iPhone-Se necesita aclaraciĆ³n (3)
Obtendrá el código de estado devuelto en el archivo didReceiveResponse
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSHTTPURLResponse *httpResponse;
httpResponse = (NSHTTPURLResponse *)response;
int statusCode = [httpResponse statusCode];
//statusCode will be the http code returned like 201,500
}
Para detener la conexión, use una variable de nivel de clase para la conexión. La mejor manera de hacerlo sería crear un contenedor que envíe solicitudes y reciba respuesta. Convierta su viewcontroller en un delegado de esta clase y cada vez que el didReceiveResponse proporcione un código de estado de error, llame al método apropiado del delegado y detenga la conexión.
Aquí hay un buen ejemplo de clase de contenedor
Estoy siguiendo junto con esta útil respuesta a mi pregunta .
Parece estar funcionando, pero aquí hay dos preguntas que tengo:
- ¿Cómo detecto un error HTTP? ¿Parece que el método didFailWithError no se llama?
ACTUALIZACIÓN: Considera cualquier respuesta un éxito . Así que supongo que tengo que manejar los errores HTTP en el método didRecieveResponse, pero además de decirle al usuario que hubo un error cuando presiono un error HTTP, ¿necesito detener la conexión de alguna manera? Y / o limpieza?
- Veo esta línea en la respuesta:
[[NSURLConnection alloc] initWithRequest:request delegate:self];
¿Debo liberar eso? ¿Dónde, cómo, cuándo?
Sí, necesitas liberar ese objeto. Consulte la Guía de programación de administración de memoria para Cocoa . Básicamente, si alguna vez crea un objeto con un nombre de método que comience con alloc
o new
o contenga copy
, se convierte en propietario del objeto y es responsable de liberarlo más tarde. Solo en el caso en que sepa que va a necesitar el objeto hasta la finalización del programa, está bien que no lo libere, en cuyo caso el sistema operativo reclama la memoria cuando finaliza su aplicación.
Si solo necesita el objeto dentro de un alcance pequeño, puede enviarle el mensaje de autorelease
. Esto lo agregará al grupo de autorrelease. El grupo de autorrelease envía periódicamente un mensaje de release
a cada objeto en él. Es algo complicado ver la sección sobre grupos de liberación automática . Por ejemplo:
En este caso, sin embargo, dado que las NSURLConnection
s son asincrónicas, la liberación automática no funcionará. No sabe exactamente cuándo volverá a llamar a su objeto con datos, por lo que desea asegurarse de que el objeto aún no se haya liberado. La única forma de estar seguro es saber exactamente cuándo ha terminado con el objeto, y luego enviarle un mensaje de release
.
Todas las diversas funciones init*
devuelven un puntero al objeto dado, por lo que puede hacer:
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
...
// when done with connection:
[connection release];
Respondiendo la pregunta en tu "actualización" ...
Libere de inmediato el NSURLConnection. El objeto de conexión es retenido por NSRunLoop (al que se agrega automáticamente a menos que utilice el constructor startImmediately: NO). Se eliminará automáticamente del bucle de ejecución (y, por lo tanto, se desbloqueará) en caso de error o finalización.