1

考虑:

  NSString*test2=[[NSString alloc]init];

test2=@"yo";
NSString *test= test2;
NSLog(@"test: %@ test2: %@",test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@",test, test2);

输出:

2012-11-14 09:50:26.720 testt[693:c07] test: yo test2: yo
2012-11-14 09:50:26.721 testt[693:c07] test: yo test2: what the?

一个人如何制作test一个真正的指针,这样当test2发生变化时,也会发生变化test

4

3 回答 3

4

NSString *test2已经是一个指针。您想创建test一个指向指针(double *)的指针,并使用前缀为其分配test2地址,然后使用&前缀访问该值*。我很讨厌解释这个,所以这里是代码:

test2=@"yo";
NSString **test= &test2;
NSLog(@"test: %@ test2: %@", *test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@", *test, test2);
于 2012-11-14T02:03:22.740 回答
3

已经创建了一个“真正的指针”,问题在于声明:

test2 = @"What the?";

正在创建一个新的字符串对象并将指向新字符串的指针分配给变量test2test仍然包含旧指针。

您可以创建一个指向指针的指针来解决这个问题。或者,您可以使用 anNSMutableString然后仅使用NSMutableString方法来更改(变异)字符串,而不是为testandtest2变量重新分配新值。

以下将是NSMutableString您的示例的版本:

NSString *test2 = [[NSMutableString alloc] initWithString:@"yo"];       
NSString *test = test2;

NSLog(@"test: %@ test2: %@", test, test2);

[test2 setString:@"what the?"];

NSLog(@"test: %@ test2: %@", test, test2);

产生输出:

2012-11-14 10:06:27.231 Untitled 2[592:707] test: yo test2: yo
2012-11-14 10:06:27.232 Untitled 2[592:707] test: what the? test2: what the?

NSStrings 在 Objective-C 中有一些额外的语法糖,因此以下两者具有相同的效果(尽管在后台发生的事情可能完全不同或相同)。

NSString *test = [NSString alloc] initWithString:@"Hello World"];
NSString *test = @"Hello World";

这两个语句都创建了一个新的不可变(不可更改)字符串。创建NSStringusing 语句[NSString alloc] init]会创建一个空字符串,这通常不是您想要做的。


这意味着,在您的示例中,前两行是:

NSString*test2=[[NSString alloc]init];
test2=@"yo";

第一行是不必要的,因为您正在创建一个字符串对象并将指针放入其中test2,然后立即用指向由创建的字符串的指针覆盖该指针@"yo"。如果您不使用 ARC,这将导致内存泄漏,因为由创建的字符串[[NSString alloc] init]尚未释放。但是,NSString它与其他对象的工作方式并不相同,因此与其泄漏内存,不如说你在浪费内存可能更正确”

于 2012-11-14T02:03:08.527 回答
0

我会尝试以下方法:

NSString *test = &test2;
于 2012-11-14T02:01:34.437 回答