为什么变量表现得如此奇怪?
-
03-07-2019 - |
题
我认为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" ??
解决方案
这就是指针的工作原理。您看到的结果是正常的和正确的。
让我们列出所有变量以及它们在声明时在内存中指向的字符串:
str1 -> "One"
str2 -> "Two"
然后,执行一些赋值指令:
test = str2;
这将指针 str2
的值赋给 test
。所以指针是
str1 -> "One"
str2 -> "Two"
test -> "Two"
然后
str2 = str1;
将指针 str1
的值赋给 str2
。现在指针是
str1 -> "One"
str2 -> "One"
test -> "Two"
然后打印<代码>测试代码>,它指向什么<代码> STR2 代码>指着原来,这是&QUOT;二&QUOT;
我想你认为你既然分配<代码> STR2 代码>到的<代码> STR1 代码>,和测试代码>到<代码> STR2的值的值
, str1
的值以某种方式级联到 test
。不是这种情况。一旦分配了 test
的值,就会丢失有关该值来源的信息。如果你想<代码>测试的值是一样的 STR1
的,你有你的逆向分配的操作顺序:
str2 = str1;
test = str2;
其他提示
你有这个:
test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??
现在,让我们假装所有这些变量都是整数。
在第一行,变量 test
设置为变量 str2
的值。
在第二行,变量 str2
设置为变量 str1
的值。
在第三行,我们打印出 test
的值,当我们分配 str2
进行测试时,它确实是 str2
的值。
完全没关系,我们随后为 str2
分配了一个不同的值。
好的,但是变量确实是指针,你说,不是整数。
无论如何:将指针视为一个数字,即内存中某处的地址。并将其传递给NSLog使得NSLog打印不是指针的值,而是指针指向的值,即char数组。
变量是一个容器。该任务采用右侧的任何内容,并将其放在左侧的任何内容中。换句话说,它将值从一个变量复制到另一个变量;在这种情况下,这些值是指针(内存地址)。
所以这就是你做的:
- 获取
str2
变量中的地址,并将相同的地址放在test
变量中。 - 获取
str1
变量中的地址,并将相同的地址放在str2
变量中。
醇>
第2步不影响 test
变量;您对该变量的唯一分配是在步骤1中。
重要提示:您不是要复制地址的内容;你正在复制地址本身。仍然只有一个&#8220;两个&#8220;字符串,但在步骤1和2之间,该对象的地址在 str2
和 test
中。然后,在步骤2中,将 str2
中的地址替换为&#8220;一个地址&#8220; string,也存在于 str1
中,只留下 test
作为唯一仍然保存&#8220;&#8220;&#8220;字符串。
BTW, stringWithCString:
已弃用。请改用 stringWithUTF8String:
或 stringWithCString:encoding:
。