我认为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" ??
答案 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
的值str1
和test
的值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)
变量是一个容器。该任务采用右侧的任何内容,并将其放在左侧的任何内容中。换句话说,它将值从一个变量复制到另一个变量;在这种情况下,这些值是指针(内存地址)。
所以这就是你做的:
str2
变量中的地址,并将相同的地址放在test
变量中。str1
变量中的地址,并将相同的地址放在str2
变量中。第2步不会影响test
变量;您对该变量的唯一分配是在步骤1中。
重要提示:您不是要复制地址的内容;你正在复制地址本身。仍然只有一个“两个”字符串,但在步骤1和2之间,该对象的地址同时位于str2
和test
。然后,在第2步中,您将str2
中的地址替换为“一个”字符串的地址,该字符串也存在于str1
中,将test
作为唯一仍然保留该字符串的变量“两个”字符串的地址。
BTW,stringWithCString:
已被弃用。请改用stringWithUTF8String:
或stringWithCString:encoding:
。