Pourquoi déréférencer un pointeur NSSsortingng n’est pas nécessaire?

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.