Todavía no entiendo la imagen completa leyendo todas las respuestas anteriores. El ejercicio de lego que hice a continuación, finalmente me ayudó a entender lo que está sucediendo.Solo ponerlo ahí en caso de que ayude a otros principiantes.
Suponga que tiene tras
@interface Class X
-(void) methodX:(NSMutableArray *)array;
@end
En alguna otra parte del código que tiene la siguiente secuencia
ClassX *objectX = [[ClassX alloc] init];
NSMutableArray *arrayXX = [@[@(1), @(2)] mutableCopy];
//What is stored in arrayXX is the address in the heap at which the NSMutableArray object starts, lets call this address ZZZ
//array starting at address ZZZ in the heap now contains NSNUmbers @1,@2
[objectX methodX:array]
Cuando se invoca [objectX methodX:array]
, lo que está siendo recibida por el método es una copia de array
. Como la matriz contiene una dirección (es decir, un puntero), la copia es especial porque lo que se recibe es otra variable con la dirección ZZZ en ella.
Entonces, si el métodoX hace [array removeObjectAtIndex:0]
, entonces el objeto que comienza en la dirección ZZZ se ve afectado (ahora solo contiene un NSNUmber @ (2)). Entonces, cuando el método retorna, la matriz original también se ve afectada.
Supongamos que en su lugar el métodoX hace array = [@[@(2)] mutableCopy];
y luego la matriz original no se ve afectada. Esto es porque no entraste en la dirección ZZZ y cambiaste algo. En su lugar, sobrescribió el ZZZ en la copia recibida por el método en una dirección diferente YYY. La dirección YYY es el inicio de un objeto NSMUtableArray con un elemento NSNUmber @ (2). La dirección ZZZ original todavía contiene un NSMUtableArray con dos elementos. @ (1) y @ (2). Entonces, cuando el método retorna, la matriz original no se ve afectada.
Hola, Peter :-) Espero que estés teniendo un buen comienzo en el nuevo año. Mientras revisaba 'C' sobre' ** ', llegué aquí en esta publicación. Disculpe, todavía no lo entiendo: si pasamos solo un '*' (un puntero a un objeto), eso sería suficiente para hacer cambios en el objeto, ¿verdad? ¿Por qué tendríamos que pasar un puntero a un puntero a un objeto para hacer cambios en un objeto? Muchas gracias de antemano. Saludos. – Unheilig
@Unheilig: "si pasamos solo un' * '(un puntero a un objeto), eso sería suficiente para hacer cambios en el objeto, ¿verdad?" A la derecha. Solo necesita el puntero al objeto para enviar mensajes a ese objeto. "¿Por qué todavía tendríamos que pasar un puntero a un puntero a un objeto para hacer cambios en un objeto?" Porque no estás haciendo cambios en un objeto; estás creando un nuevo objeto y devolviéndolo a la persona que llama. Lo hace asignándolo a la dirección que le dio la persona que llama: el puntero a la variable donde colocará el puntero al objeto. –
+1. Gracias por aclarar esto también. – Unheilig