NSString不会在源代码的“消隐”之后获得值NSMutableString

问题描述:

这是一个比实际更为理论化的问题;NSString不会在源代码的“消隐”之后获得值NSMutableString

假设我有两个字符串,一个正常的和一个可变的,如果我这样做:

NSMutableString *prova = [[NSMutableString alloc] init]; 
NSString *prova2 = [[NSString alloc] init]; 
[prova appendFormat:@"%@",@"CIAO"]; 
prova2 = prova; 
NSLog(@"String: %@",prova); 
NSLog(@"String2: %@",prova2); 
[prova setString:@""]; 
NSLog(@"-String: %@",prova); 
NSLog(@"-String2: %@",prova2); 

那么结果是:

2013-04-22 22:01:53.604 CodeTest[6974:303] String: CIAO 
2013-04-22 22:01:53.605 CodeTest[6974:303] String2: CIAO 
2013-04-22 22:01:53.605 CodeTest[6974:303] -String: 
2013-04-22 22:01:53.606 CodeTest[6974:303] -String2: 

它为什么这样的表现? 我只是想找到它,因为我从来没有遇到过这样的事情,而在编程蟒蛇,PHP或C + +(我认为我从来没有面对如此多的不同数据类型在Obj - C:P)

由于

以防万一有人想知道如何克服它这里是我用来赋值到字符串没有“屏蔽”后失去它的正确的代码(sostitute到prova2 = PROVA):

prova2 = [NSString stringWithString:prova]; 
+0

好了,你证实了我的怀疑,我认为我有很多事情要了解obj-c。谢谢大家的真正快速的答案:) – Frankie94 2013-04-22 20:25:52

+0

C++也有指针,以相同的方式工作 – 2013-04-23 01:25:18

请记住,NSStringNSMutableString变量是指针。这意味着当您分配prova2 = prova时,您确实将prova2更改为指向prova,并且您分配给prova2的值将丢失。

因此,当您将空字符串分配给prova时,两个变量都指向@""

prova2 = prova; 

这不指定字符串的内容在prova在字符串中prova2,它只是使prova2指向同一个对象prova,有效地漏是prova2用来指向字符串。因此,即使prova2被宣布为NSString*,它现在也指向NSMutableString

除了理查德·布朗的极大反响,这就是你想要做的,而不是为所期望的行为是什么:

[prova2 setString: prova]; 

,而不是

prova2 = prova; 
+0

谢谢,这也比我使用和张贴在底部。 – Frankie94 2013-04-22 20:24:35

+0

没问题,男人;) – dmee3 2013-04-22 20:26:50

+0

,但我不能得到它的工作:(它给了我:“NSString可能不会响应'setString'”作为警告,然后崩溃时,我调用它 – Frankie94 2013-04-22 20:28:44