Non ho ancora ottenuto l'immagine completa leggendo tutte le risposte sopra. L'esercizio profano che ho fatto qui sotto, finalmente mi ha aiutato a capire cosa sta succedendo.Basta metterlo là fuori nel caso in cui aiuta altri principianti.
Supponete di avere seguito
@interface Class X
-(void) methodX:(NSMutableArray *)array;
@end
in qualche altra parte del codice si ha la seguente sequenza
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]
Quando si richiama [objectX methodX:array]
, ciò che viene ricevuto dal metodo è una copia di array
. Poiché la matrice contiene un indirizzo (cioè un puntatore), la copia è speciale in quanto ciò che viene ricevuto è un'altra variabile con indirizzo ZZZ in essa.
Quindi, se methodX fa [array removeObjectAtIndex:0]
, l'oggetto che inizia all'indirizzo ZZZ viene interessato (ora contiene solo un NSNUmber @ (2)). Quindi, quando il metodo ritorna, anche l'array originale viene influenzato.
Supponiamo invece che methodX sia array = [@[@(2)] mutableCopy];
quindi l'array originale non viene interessato. Questo perché non hai inserito l'indirizzo ZZZ e cambiato qualcosa. Invece hai sovrascritto lo ZZZ nella copia ricevuta con il metodo su un diverso indirizzo YYY. L'indirizzo YYY è l'inizio di un oggetto NSMUtableArray con un elemento NSNUmber @ (2). L'indirizzo ZZZ originale contiene ancora un NSMUtableArray con due elementi. @ (1) e @ (2). Quindi, quando il metodo ritorna, l'array originale non viene modificato.
fonte
2016-08-12 06:35:38
Ciao Peter :-) Spero che stiate iniziando il nuovo anno. Mentre sfioriamo "C" su "**" sono atterrato qui su questo post. Scusami, non riesco ancora a capirlo: se abbiamo passato solo un '* (un puntatore a un oggetto), questo dovrebbe essere sufficiente per apportare modifiche all'oggetto, giusto? Perché dovremmo ancora passare un puntatore a un puntatore a un oggetto per apportare modifiche a un oggetto? Grazie mille in anticipo. Saluti. – Unheilig
@Unheilig: "se passassimo solo un' * '(un puntatore a un oggetto), ciò dovrebbe essere sufficiente per apportare modifiche all'oggetto, giusto?" Giusto. Hai solo bisogno del puntatore all'oggetto per inviare messaggi a quell'oggetto. "Perché dovremmo ancora passare un puntatore a un puntatore a un oggetto per apportare modifiche a un oggetto?" Perché non stai apportando modifiche a un oggetto; stai creando un nuovo oggetto e restituendolo al chiamante. Lo fai assegnandolo all'indirizzo che ti ha dato il chiamante, il puntatore alla variabile in cui metti il puntatore all'oggetto. –
+1. Grazie per aver chiarito tutto. – Unheilig