Dans l’exemple
NSSsortingng *message = @"Hello"; message = @"World";
Si le message est juste un pointeur, pourquoi n’ai-je pas besoin de dire explicitement que tout ce qui est dans le message est maintenant égal à chaîne ou *message = @"World";
comme en C?
AVERTISSEMENT
La discussion ci-dessous donne une idée générale de la raison pour laquelle vous ne déréférenciez jamais un pointeur sur un object dans Objective-C. Cependant, concernant le cas spécifique des littéraux NSSsortingng
, ce n’est pas ce qui se passe dans la réalité. Bien que la structure décrite ci-dessous soit toujours valable et qu’elle fonctionne peut-être de cette manière, ce qui se passe réellement, c’est que l’espace pour un littéral de chaîne est alloué au moment de la compilation et que vous récupérez son adresse. Ceci est vrai pour les littéraux de chaîne, car ils sont immuables et constants. Par souci d’efficacité, chaque littéral n’est atsortingbué qu’une seule fois.
À vrai dire
NSSsortingng * a = @"Hello"; NSSsortingng * b = @"Hello"; NSLog(@"%@ %p", a, a); // Hello 0x1f4958 NSLog(@"%@ %p", b, b); // Hello 0x1f4958
RÉPONSE ORIGINALE
Parce qu’il sera traduit en
message = [[NSSsortingng alloc] initWithUTF8Ssortingng:"Hello"]];
qui va se résumer à
message = objc_msgSend(objc_msgSend(objc_getClass("NSSsortingng"), @selector(alloc)), @selector(initWithUTF8Ssortingng:), "Hello");
Regardons maintenant la signature de objc_msgSend
id objc_msgSend(id theReceiver, SEL theSelector, ...)
nous voyons que la méthode retourne un type id
qui, dans Objective-C, est le type d’object. Mais comment id
réellement?
typedef struct objc_object { Class isa; } *id;
id
est défini comme un pointeur sur une structure objc_object
.
Donc, à la fin, @"ssortingng"
se traduira par un appel de fonction qui produira un pointeur sur un object (c’est-à-dire une structure objc_object
, si vous préférez), ce qui correspond exactement à ce que vous devez affecter au message
.
En bout de ligne, vous affectez des pointeurs, pas des objects .
Pour mieux clarifier le dernier concept, considérons ceci
NSMutableSsortingng * a = [NSMutableSsortingng ssortingngWithSsortingng:@"hello"]; NSMutableSsortingng * b = a; [a setSsortingng:@"hola"]; NSLog(@"%@", a); // "hola" NSLog(@"%@", b); // "hola"
Si vous affectiez des objects, b
aurait été une copie de a
et toute modification ultérieure de a
n’aurait pas eu d’incidence sur b
.
Au lieu de cela, vous obtenez a
et b
sont deux pointeurs sur le même object dans le tas.