Perché la mia variabile di istanza si comporta in modo strano? Ho capito bene?
-
03-07-2019 - |
Domanda
Per provare alcuni elementi del puntatore, ho creato una variabile di istanza in un progetto esistente. È stato dichiarato così:
@interface PointerFun : NSObject {
NSString* test;
}
Non ho una direttiva del compilatore @property, nessuna @synthesize, quindi nessun getter e nessun setter. Solo per test.
Quindi ho un metodo, dove provo alcune cose con i puntatori e questa variabile di istanza. Quello che volevo davvero verificare è cosa succederebbe quando assegnassi a quella variabile di istanza un oggetto NSString (o qualunque oggetto), e dopo aver assegnato l'oggetto, assegnerei un altro oggetto a quel puntatore che ho assegnato all'istanza var. Ho pensato che avrebbe cambiato l'oggetto nell'istanza var come weell.
Quindi ecco il mio codice:
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
Come vedi, la variabile di istanza continua a puntare all'oggetto NSString che era all'inizio dietro str2. Quindi, quando ho assegnato str1 a str2, ho assegnato il valore di str1 a str2, che è un indirizzo di memoria. Quindi ho fatto in modo che entrambi i puntatori avessero lo stesso valore, giusto?
Ma quando ho assegnato il valore di str2 a test, test ha assunto il valore di str2, che era - in quel momento - l'indirizzo di memoria per i "due" oggetto. Quindi, anche se cambio dopo quell'assegnazione il valore del puntatore str2, ciò non influirà sul valore della variabile di istanza. E poiché si tratta di un puntatore a un oggetto NSString, si comporta come se fosse str1 o str2. Non c'è differenza solo perché è un'istanza var. È solo una variabile, o meglio: è solo un puntatore. Ho capito bene? phew;) ... lo spero!
Soluzione
Le tre variabili sono in realtà puntatori (test, str1 e str2) e hai 2 oggetti creati: " one " e "due".
Quando lo fai:
test = str2;
stai testando l'oggetto "due", e quando lo fai:
str2 = str1;
stai puntando str2 sull'oggetto "uno", che non influisce affatto sul test.