我认为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数组。

变量是一个容器。该任务采用右侧的任何内容,并将其放在左侧的任何内容中。换句话说,它将值从一个变量复制到另一个变量;在这种情况下,这些值是指针(内存地址)。

所以这就是你做的:

  1. 获取 str2 变量中的地址,并将相同的地址放在 test 变量中。
  2. 获取 str1 变量中的地址,并将相同的地址放在 str2 变量中。
  3. 第2步不影响 test 变量;您对该变量的唯一分配是在步骤1中。

    重要提示:您不是要复制地址的内容;你正在复制地址本身。仍然只有一个&#8220;两个&#8220;字符串,但在步骤1和2之间,该对象的地址 str2 test 中。然后,在步骤2中,将 str2 中的地址替换为&#8220;一个地址&#8220; string,也存在于 str1 中,只留下 test 作为唯一仍然保存&#8220;&#8220;&#8220;字符串。

    BTW, stringWithCString:已弃用。请改用 stringWithUTF8String: stringWithCString:encoding:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top