2012-01-03 15 views
10

Estoy empezando a jugar con ARC, y uno de los primeros experimentos que intenté fue realizar una llamada HTTP a una URL y recuperar algunos datos. Por supuesto, el código de estado HTTP es importante para mí, lo que significa que fui a mi "Goto" de utilizar sendSynchronousRequest como:NSURLConnection sendSynchronousRequest con ARC

NSError *error = [[NSError alloc] init]; 
NSHTTPURLResponse *responseCode = nil; 

NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:responseCode error:error]; 

Con ARC permitió llego a errores y advertencias del compilador en la última línea.

errores:

Implicit conversion of an Objective-C pointer to 'NSURLResponse *__autoreleasing *' is disallowed with ARC

Implicit conversion of an Objective-C pointer to 'NSError *__autoreleasing *' is disallowed with ARC

file://localhost/Users/jason/Projects/test/Data/DataService.m: error: Automatic Reference Counting Issue: Implicit conversion of an Objective-C pointer to 'NSURLResponse *__autoreleasing *' is disallowed with ARC

file://localhost/Users/jason/Projects/test/Data/DataService.m: error: Automatic Reference Counting Issue: Implicit conversion of an Objective-C pointer to 'NSError *__autoreleasing *' is disallowed with ARC

Advertencias:

Incompatible pointer types sending 'NSHTTPURLResponse *_strong' to parameter of type 'NSURLResponse *_autoreleasing *'

Incompatible pointer types sending 'NSError *_strong' to parameter of type 'NSError *_autoreleasing *'

De lo que puedo decir el paso de referencia es lo que está metiendo con esto, pero estoy seguro de lo que la forma correcta de resolver esto es ¿Hay una forma "mejor" de realizar una tarea similar con ARC?

Respuesta

22
NSError *error = nil; 
    NSHTTPURLResponse *responseCode = nil; 

    NSURLRequest *request; 

    NSData *oResponseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseCode error:&error]; 

le falta la referencia al error/responceCódigo puntero!

+0

¡LOL ... me sirve para tratar de pensar después de las vacaciones! –

2

Tienes que utilizar el tipo (NSHTTPURLResponse __autoreleasing *) y el tipo (NSError __autoreleasing *).

NSHTTPURLResponse __autoreleasing *response = nil; 
NSError __autoreleasing *error = nil; 

// request 
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

Y usted puede manejarlos en el seguimiento:

if (response){ 
    // code to handle with the response 
} 
if (error){ 
    // code to handle with the error 
} 

De lo contrario, no puede respuesta uso y error como VARs globales. Si ha hecho, no funcionarán correctly.Like siguiente:

.h 
NSHTTPURLResponse *__autoreleasing *response; 
NSError *__autoreleasing *error; 

.m 
// request 
NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:response error:error]; 

El código anterior no va a funcionar!

Cuestiones relacionadas