objective-c - 为什么变量的行为如此奇怪?

标签 objective-c cocoa memory-management variables object

我认为 Objective-C 中的变量只是对内存中某处对象的引用。所以根据我的理解,结果一定是“1”,因为最后我将对象的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"

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

我认为您认为既然您将 str2 分配给 str1 的值,并将 test 分配给 str2str1 的值以某种方式级联到 test 中。不是这种情况。一旦分配了 test 的值,有关该值来自何处的信息就会丢失。如果您希望 test 的值与 str1 的值相同,则可以颠倒赋值操作的顺序:

str2 = str1;
test = str2;

关于objective-c - 为什么变量的行为如此奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/801959/

相关文章:

objective-c - 在 NSTableView 的同一单元格中显示图标和文本

c - 为什么堆栈内存 "cheaper"而不是 C 中的堆内存?

ios - 代码反馈与MVC理解

ios - Objective c 只允许两个单词之间有空格,前后都不允许

objective-c - NSCollectionView 在更改 minItemSize 后丢失滚动条,直到 View 调整大小

cocoa - 在同一个 NSPredicateEditorRowTemplate 中合并多个本地化的左键路径?

objective-c - 使用 GCD 的慢循环

iphone - 仪器中可接受的实时字节值是多少?

c++ - 重载新的 friend 功能?

objective-c - 将多个详细 View 与 Split View Controller 一起使用