Je ne ai toujours pas eu l'image complète en lisant toutes les réponses ci-dessus. L'exercice de profane que j'ai fait ci-dessous, m'a finalement aidé à comprendre ce qui se passe.Juste le mettre là-bas au cas où il aide d'autres débutants.
Supposons que vous avez ci-dessous
@interface Class X
-(void) methodX:(NSMutableArray *)array;
@end
Dans une autre partie du code que vous avez la séquence suivante
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]
Lorsque vous appelez [objectX methodX:array]
, ce qui est reçu par la méthode est une copie de array
. Puisque le tableau contient une adresse (c'est-à-dire un pointeur), la copie est spéciale en ce que ce qui est reçu est une autre variable avec l'adresse ZZZ dedans. Donc, si methodX fait [array removeObjectAtIndex:0]
, alors l'objet commençant à l'adresse ZZZ est affecté (il ne contient plus qu'un seul NSNUmber @ (2)). Ainsi, lorsque la méthode revient, le tableau d'origine est également affecté. Supposons à la place que methodX fasse array = [@[@(2)] mutableCopy];
alors le tableau original n'est pas affecté. C'est parce que vous n'êtes pas allé dans l'adresse ZZZ et changer quelque chose. Au lieu de cela, vous avez écrasé le ZZZ dans le copie reçu par la méthode à une adresse différente YYY. L'adresse YYY est le début d'un objet NSMUtableArray avec un élément NSNUmber @ (2). L'adresse ZZZ d'origine contient toujours un NSMUtableArray avec deux éléments. @ (1) et @ (2). Ainsi, lorsque la méthode retourne, le tableau d'origine n'est pas affecté.
Salut, Peter :-) J'espère que vous commencez bien la nouvelle année. En brossant le 'C' à propos de' ** 'j'ai atterri ici sur ce post. Excusez-moi, je ne comprends toujours pas: si nous passions seulement un '*' (un pointeur sur un objet), cela devrait suffire pour apporter des modifications à l'objet, n'est-ce pas? Pourquoi devrions-nous toujours passer un pointeur vers un pointeur vers un objet pour apporter des modifications à un objet? Merci d'avance. Cordialement. – Unheilig
@Unheilig: "si nous passions seulement un' * '(un pointeur sur un objet), cela devrait suffire pour apporter des modifications à l'objet, n'est-ce pas?" Vous avez seulement besoin du pointeur sur l'objet pour envoyer des messages à cet objet. "Pourquoi aurions-nous encore besoin de passer un pointeur sur un pointeur vers un objet pour apporter des modifications à un objet?" Parce que vous n'apportez pas de modifications à un objet; vous créez un nouvel objet et le renvoyez à l'appelant. Vous faites cela en l'assignant à l'adresse que l'appelant vous a donnée - le pointeur vers la variable où vous placerez le pointeur sur l'objet. –
+1. Merci d'avoir éclairci cela aussi. – Unheilig