为什么变量表现得如此奇怪?

Tha*_*nks 2 variables cocoa memory-management object objective-c

我认为objective-c中的变量只是对内存中某个对象的引用.所以对于我的理解,结果必须是"一",因为最后我将str1的对象的内存地址分配给str2,之前我已经分配了str2的内存地址来测试.

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

test = str2; // test is an instance variable. I use no getter/setter here! just for testing!
str2 = str1;
NSLog(test); // = "two" ??
Run Code Online (Sandbox Code Playgroud)

Wel*_*bog 7

这就是指针的工作原理.您看到的结果是正常和正确的.

让我们列出所有变量以及它们在声明时在内存中指向的字符串:

str1 -> "One"
str2 -> "Two"
Run Code Online (Sandbox Code Playgroud)

然后,执行一些赋值指令:

test = str2;
Run Code Online (Sandbox Code Playgroud)

此分配指针的值str2test.所以指针是

str1 -> "One"
str2 -> "Two"
test -> "Two"
Run Code Online (Sandbox Code Playgroud)

然后

str2 = str1;
Run Code Online (Sandbox Code Playgroud)

分配指针的值str1str2.现在指针是

str1 -> "One"
str2 -> "One"
test -> "Two"
Run Code Online (Sandbox Code Playgroud)

然后打印test,str2指向最初指向的内容,即"两个".

我想,你认为你既然分配str2到的价值str1,以及test它的值str2,该值str1在某种程度上倾泻而下test.不是这种情况.一旦test分配了值,就会丢失有关该值来源的信息.如果你想要test的值与s相同str1,你可以颠倒你的赋值操作的顺序:

str2 = str1;
test = str2;
Run Code Online (Sandbox Code Playgroud)