2012-11-14 94 views
1

考虑:创建一个NSString指针

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

[email protected]"yo"; 
NSString *test= test2; 
NSLog(@"test: %@ test2: %@",test, test2); 
[email protected]"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

+1

您需要使用指针指针,因为'test'已经是一个指针。 –

回答

4

NSString *test2已经是一个指针。你会想使test指针一个指针(双重*),并使用&前缀将test2的地址分配给它,然后使用*前缀访问该值。我吮吸解释这个,所以这里是代码:

[email protected]"yo"; 
NSString **test= &test2; 
NSLog(@"test: %@ test2: %@", *test, test2); 
[email protected]"what the?"; 
NSLog(@"test: %@ test2: %@", *test, test2); 
+0

作品很好,是一个很好的考试,谢谢 – johnbakers

0

我会尝试像下面这样:

NSString *test = &test2; 
+0

请参阅上面的@ FilipRadelic答案 - 它需要两颗星,而不是一颗。 – johnbakers

2

创造了一个“真正的指针”,问题是,声明:

test2 = @"What the?"; 

是创建一个新的字符串对象并将指向新字符串的指针分配给变量test2,test仍包含旧指针。

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

以下将是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 alloc] init]创建NSString会创建一个空字符串,这通常不是您想要执行的操作。


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

NSString*test2=[[NSString alloc]init]; 
[email protected]"yo"; 

第一行是不必要的,因为要创建一个字符串对象,并把该指针在test2,然后立即重写该指针带有指向由@"yo"创建的字符串的指针。如果您不使用ARC,则会导致内存泄漏,因为由[[NSString alloc] init]创建的字符串尚未发布。然而,NSString并没有真正的工作同其他对象,因此而不是内存泄漏,它可能会更正确的说你是在浪费内存”

+0

NSMutableString可能是一个更好的解决方案,是的。我想知道OP在努力实现什么。 –

+0

我只是试图了解Objective C中的字符串和指针是如何工作的。这是一个比任何事情都重要的练习。 – johnbakers

+0

关于你有关“额外语法糖”的观点 - 在第一个中显式调用'init'现在创建所有权,而第二个,'= @“哟”'不是,因此内存泄漏对于第二种方法,而第一种方法如果在非Arc环境中没有释放,就会冒风险,对吗? – johnbakers