Pregunta

Estoy usando NSURLConnection que se enumeran a continuación. Tengo tres preguntas acerca de esta clase. Cuando concatenar el valor URL, el depurador llega esta línea dos veces, pero no la línea por encima de ella:

if (theConnection){

La segunda vez que llego EXC_BAD_ACCESS. El uso de la primera asignación url (comentada) funciona bien.

1.) ¿Cuál es la diferencia?

- (void)applicationDidFinishLaunching:(UIApplication *)application {

//NSString *url = @"http://www.abc.com/afile.mp4";

NSString *temp = @"afile.mp4";
NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp];

theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                                     cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
[url release]; 

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    receivedData=[[NSMutableData data] retain];
}

2.) Si cambio el nombre del archivo a afile.mp, la solicitud pasa por y [longitud receivedData] tiene un valor de alrededor de 1600 cuando

    - (void)connectionDidFinishLoading:(NSURLConnection   *)connection

es golpeado. ¿Hay una manera de comprobar con precisión si receivedData tiene los datos reales que está solicitando. El archivo de destino es de aproximadamente 7 MB, pero puede variar de 1,5 MB a 9 MB. El recurso pedí no estaba allí pero nada indica que?

3.) Estoy haciendo esto en mi aplicación delegado. El único protocolo hay UIApplicationDelegate. ¿Cómo todos los métodos NSURLConnection trabajar si no hay un delegado para ellos?

¿Fue útil?

Solución

  

1.) ¿Cuál es la diferencia?

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    //NSString *url = @"http://www.abc.com/afile.mp4";
    NSString *temp = @"afile.mp4";
    NSString *url = [@"http://www.abc.com/" stringByAppendingString:temp];

    theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] 
                                                                             cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    [url release]; 

La diferencia es que uno de ellos le permite alejarse con la liberación de algo que no es dueño y el otro no lo hace.

Usted no alloc, copiarlo, o retenerlo, por lo que no lo posee, por lo que no se suelte.

Como un detalle de implementación, los literales de cadena no implementan de recuento de referencias. Cuerda objetos literales te ignorarán cuando intenta retener o liberarlos. Es por eso que la versión en la que se libera una cadena literal no se bloquea, y la versión que se puede crear una nueva cadena y la liberación que lo haga. Pero esta es una implementación detalle-no confiar en ella para nada. Siempre asuma que la liberación de algo que no es dueño causará un accidente.

  

¿Hay una manera de comprobar con precisión si receivedData tiene los datos reales que está solicitando.

A diferencia de documento de error? Compruebe el código de respuesta.

A diferencia de algunos otros datos? Se podría utilizar hashes, a pesar de cómo se determina el hash correcto sería esperar hasta usted. Sin embargo, es probable que sea más fácil simplemente tener fe en que el servidor no le dará el archivo incorrecto.

  

El recurso pedí no estaba allí pero nada indica que?

Sí. Implementar connection:didReceiveResponse: y comprobar el código de respuesta.

Tenga en cuenta que si el servidor está utilizando mod_speling o algo similar, puede corregir su dirección URL en lugar de devolver un ejemplo de errores para, cambiando el “afile.mp” que ha solicitado a la “afile.mp4” que realmente existe .

  

3.) Estoy haciendo esto en mi aplicación delegado. El único protocolo hay UIApplicationDelegate. ¿Cómo todos los métodos NSURLConnection trabajar si no hay un delegado para ellos?

Dijiste delegate:self, por lo que es el delegado de la conexión.

En el Mac, al menos, las categorías NSURLConnection los métodos Onto NSObject, para que estén siempre disponibles, al menos en forma no-op. Se reemplaza estas implementaciones, así que cuando NSURLConnection envía a su delegado de conexión (que) esos mensajes, que va a través de las implementaciones que nos ha facilitado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top