Pourquoi ma variable d'instance se comporte-t-elle si étrangement? Ai-je bien compris?

StackOverflow https://stackoverflow.com/questions/803218

  •  03-07-2019
  •  | 
  •  

Question

Pour essayer quelques trucs de pointeur, j'ai créé une variable d'instance dans un projet existant. C'est juste déclaré comme ceci:

@interface PointerFun : NSObject {
    NSString* test;
}

Je n'ai pas de directive de compilation @property, pas de synthèse @, donc pas de getter ni de setter. Juste pour tester.

Ensuite, j’ai une méthode qui consiste à essayer certaines choses avec des pointeurs et cette variable d’instance. Ce que je voulais en fait vérifier, c’est ce qui se passerait lorsque j’affecterais à la variable d’instance un objet NSString (ou un objet quelconque), et après l’affectation de l’objet, affectez un autre objet au pointeur que j’ai affecté à l’instance var. Je pensais que cela changerait l'objet dans l'instance var comme weell.

Alors voici mon code:

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // assign directly to instance variable (bad thing, just for testing!)
str2 = str1; // now lets be really mean and change the object from that pointer!!

NSLog(@"test: %x, %@", test, test); // test: 52cb10, two
NSLog(@"str1: %x, %@", str1, str1); // str1: 52ca60, one 
NSLog(@"str2: %x, %@", str2, str2); // str2: 52ca60, one

Comme vous le voyez, la variable d’instance continue de pointer sur l’objet NSString qui était au début derrière str2. Ainsi, lorsque j'ai affecté str1 à str2, j'ai affecté la valeur de str1 à str2, qui est une adresse mémoire. J'ai donc fait en sorte que les deux pointeurs aient la même valeur, non?

Mais quand j'ai assigné la valeur de str2 à tester, test a repris la valeur de str2, qui était - à cette heure- l'adresse de mémoire pour le "deux" objet. Ainsi, même si je change après cette affectation la valeur du pointeur str2, cela n’affectera pas la valeur de la variable d’instance. Et comme il s’agit d’un pointeur sur un objet NSString, il se comporte comme si c’était str1 ou str2. Il n'y a pas de différence simplement parce que c'est une instance var. C'est juste une variable, ou mieux: c'est juste un pointeur. Ai-je bien compris? ouf;) ... espérons-le!

Était-ce utile?

La solution

Les trois variables sont en fait des pointeurs (test, str1 et str2) et vous avez créé 2 objets: "un" et "deux".

Quand vous le faites:

test = str2;

vous faites un point de test sur l'objet "deux", puis vous:

str2 = str1;

vous faites en sorte que str2 pointe sur l'objet "un", ce qui n'a aucune incidence sur le test.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top