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

时间:2009-04-29 11:40:08

标签: objective-c cocoa memory-management variables object

我认为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" ??

3 个答案:

答案 0 :(得分:7)

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

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

str1 -> "One"
str2 -> "Two"

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

test = str2;

这会将指针str2的值指定给test。所以指针是

str1 -> "One"
str2 -> "Two"
test -> "Two"

然后

str2 = str1;

将指针str1的值指定给str2。现在指针是

str1 -> "One"
str2 -> "One"
test -> "Two"

然后你打印test,它指向str2最初指向的内容,即“两个”。

我认为您认为,因为您将str2的值str1test的值str2分配给了str1的值test不知何故级联进入test。不是这种情况。一旦分配了test的值,就会丢失有关该值来源的信息。如果您希望str1的值与str2 = str1; test = str2; 相同,则可以颠倒分配操作的顺序:

{{1}}

答案 1 :(得分:0)

你有这个:

test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??

现在,让我们假装所有这些变量都是整数。

在第一行,变量test设置为变量str2的值。 在第二行,变量str2设置为变量str1的值。 在第三行,我们打印出test的值,它确实是我们指定str2进行测试时str2的值。 完全没关系,我们随后为str2分配了不同的值。

好的,但是变量确实是指针,你说,不是整数。

无论如何:将指针视为一个数字,即内存中某处的地址。并将其传递给NSLog使得NSLog打印不是指针的值,而是指针指向的值,即char数组。

答案 2 :(得分:0)

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

所以这就是你做的:

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

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

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

相关问题