После того, как я подумал, что понял, как они работают, я попробовал это:
NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two
str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, two
Значение указателя (например, str1, str2) является адресом памяти. Когда вы переходите по этому адресу, вы попадаете в «область» памяти, где хранится объект.
Но: когда я назначаю str2 для str1, str1 должен иметь в качестве значения адрес памяти того же объекта, на который ссылается str2, верно? Странная вещь здесь в том, что значение указателя остается тем же (адрес памяти bfffd3cc), где вещь за этим адресом изменяется. это на самом деле совершенно нелогично для меня;) потому что я думаю, что адрес памяти - это объект (или дом объекта в блоке памяти, что угодно). Так что я ожидал этого:
NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3cc, one
NSLog(@"str2: %x, %@", &str2, str2); //bfffd3c8, two
str1 = str2;
NSLog(@"str1: %x, %@", &str1, str1); //bfffd3c8, two
В противном случае, я все еще не понял суть. Соотношение между значением «переменной-указателя» и «действительным значением», скажем, объекта, который находится за этим адресом памяти.