NSError * vs NSError **

Me doy count de que esto es similar a una publicación existente aquí, ¿Cuál es el error Point of (NSError **)? , pero mi pregunta es un poco diferente. Entiendo cómo funciona el doble puntero y cómo este es el patrón de error común de la API de iOS. Mi pregunta es más en torno al puntero único, y por qué este código no funciona:

- (BOOL)someMethodWithError:(NSError *)error { ... if( errorOccunetworking ) { NSError *e = [[[NSError alloc] initWithDomain:@"" code:1 userInfo:nil] autorelease]; error = e; return NO; } return YES; } 

implementado usando:

 NSError *error = nil; if( ![someObj someMethodWithError:error] ) { NSLog(@"Error: %@", [error localizedDescription]); } 

¿Por qué la asignación en la implementación del método no reasigna el puntero al nuevo object NSError?

Me parece que ayuda pensar un puntero como solo un integer. (Eso es lo que es.)

Mira tu ejemplo con int.

 -(BOOL)someMethodWithError:(int)error { error =100; return NO; } 

Ese integer es pasar por valor. Una vez que se llama a esa function, el error no cambiará.

  error = 123; [self someMethodWithError:error]; //error is = 123; 

El puntero es lo mismo. Es pasar por valor.

  NSError * error; //this assigns this to a value in memory. NSLog(@"%p",error); [self someMethodWithError:error]; NSLog(@"%p",error); // the value of error will not have changed. 

si desea que el puntero cambie, debe enviar un puntero a ese puntero y cambiarlo. Es confuso, pero dibuja un diagtwig de memory y piensa en ello. 🙂

Todo se trata del doble puntero.

¿Por qué no se muestra el nuevo valor? Porque nunca modificó el contenido del object que inicializó como nulo. Para hacerlo, habría necesitado utilizar una reference a la location de la memory donde se almacenó el valor nil (un puntero al puntero), no solo una copy del valor nil (que es lo que está pasando usando el puntero único).

Esto es algo realmente común en C, donde parte del resultado de una function se "devuelve" a través de un puntero en los arguments de input.

Así es como funciona el lenguaje C. Tal vez le interese echar un vistazo a esta pregunta y responder: puntero doble C , que es básicamente lo mismo en un disfraz diferente.

Bueno, el error que tiene somemethodWithError es un puntero diferente que contiene la dirección del error desde donde se llama a someMethodWithError. así que cuando asigna cualquier object al puntero de error de someMethodWithError , no se reflejará en el puntero de error del método desde el que se llama

es como

 NSError * error1 = obj1; NSError * error2 = error1; 

y luego si asigna cualquier object nuevo a error2 como

 error2 = obj2; 

no cambiará el valor del puntero de error1 y seguirá apuntando a obj1