0

这是一个比实际问题更理论的问题;

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

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:

为什么它会这样?我只是想找出答案,因为我以前在使用 python、php 或 C++ 编程时从未遇到过这样的事情(我想我从未遇到过像 Obj-c 中这么多不同的数据类型:P)

谢谢

以防万一有人想知道如何在这里克服它是我用来将值分配给字符串而不在“消隐”之后丢失它的正确代码(代替prova2 = prova):

prova2 = [NSString stringWithString:prova];
4

3 回答 3

4

请记住,NSStringNSMutableString变量是指针。这意味着当您分配时,prova2 = prova您实际上正在更改prova2指向prova,并且您分配的值prova2丢失了。

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

于 2013-04-22T20:13:25.203 回答
1
prova2 = prova;

这不会将字符串 in 的内容分配给prova字符串 in prova2,它只是prova2指向与 相同的对象prova,从而有效地泄漏了prova2曾经指向的字符串。所以即使prova2被声明为 a NSString*,它现在指向 a NSMutableString

于 2013-04-22T20:14:06.283 回答
0

除了 Richard Brown 的出色回应之外,这就是您想要为期望的行为做的事情:

[prova2 setString: prova];

代替

prova2 = prova;
于 2013-04-22T20:15:55.737 回答