考虑:
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
也会发生变化?
答案 0 :(得分:4)
NSString *test2
已经是一个指针。您想要指向指针(test
)的*
指针,并使用test2
前缀为其分配&
的地址,然后使用{{*
访问该值1}}前缀。我很难解释这个,所以这里是代码:
test2=@"yo";
NSString **test= &test2;
NSLog(@"test: %@ test2: %@", *test, test2);
test2=@"what the?";
NSLog(@"test: %@ test2: %@", *test, test2);
答案 1 :(得分:2)
你已经创建了一个“真正的指针”,问题是声明:
test2 = @"What the?";
正在创建一个新的字符串对象,并将指向新字符串的指针分配给变量test2
,test
仍包含旧指针。
您可以创建指向指针的指针来解决此问题。或者,您可以使用NSMutableString
,然后仅使用NSMutableString
方法更改(变更)字符串,而不是将新值重新分配给test
和test2
变量。
以下是您示例的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?
NSString
在Objective-C中有一些额外的语法糖,因此以下两者具有相同的效果(尽管在后台发生的事情可能完全不同或相同)。
NSString *test = [NSString alloc] initWithString:@"Hello World"];
NSString *test = @"Hello World";
这两个语句都创建了一个新的不可变(不可更改)字符串。使用语句NSString
创建[NSString alloc] init]
会创建一个空字符串,这通常不是您想要做的。
这意味着,在您的示例中,前两行是:
NSString*test2=[[NSString alloc]init];
test2=@"yo";
第一行是不必要的,因为您正在创建一个字符串对象并将指针放在test2
中,然后立即用指向@"yo"
创建的字符串的指针覆盖该指针。如果您不使用ARC,则会导致内存泄漏,因为[[NSString alloc] init]
创建的字符串尚未释放。但是,NSString
并不像其他对象那样真正起作用,所以不要泄漏内存,说你浪费记忆可能更为正确“
答案 2 :(得分:0)
我会尝试以下内容:
NSString *test = &test2;