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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top