2011-04-08 87 views
1

如果我有这段代码,为什么textview的文本没有更新?据我所知,一个*表示一个指针,而我没有做一个副本。Objective-c指针和NSString

NSString *searchText = myTextView.text; 

searchText = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"]; 

那么,为什么不myTextView的文本改变,如果我做的:

myTextView.text = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"]; 

我怎么会写代码,从而使第一个代码示例工程,我打算?

回答

2

如果您希望修改myTextView.text,则必须像第二个示例那样编写它,并为您要修改的属性指定一个新值。为其他变量或属性指定一个新值不会完成这项工作 - 当我们最终进行量子计算时,“spooky action at a distance”可能工作,但我们还没有完成。 :-)

要扩大一点:是的,searchText是一个指针。但myTextView.text也是如此,当你做“searchText = myTextView.text”时,你并没有在两者之间建立任何持久关系 - 你所做的只是让searchText指向与myTextView.text相同的目标。在这一点之后改变其中的一个对另一个没有影响。因此,当您将stringByReplacing...的结果分配到searchText时,您正在制作而只有它指向不同的目标。

+0

谢谢你,你最后一段的答案才是最有意义的。当执行'searchText = myTextView.text'时,我正在改变searchText指向的位置,而不是改变searchText指向的内容。有没有办法改变'searchText'指向的内容? – 2011-04-09 07:57:08

+0

仅当searchText指向一个NSMutableString实例时 - NSString的内容才能更改。 – 2011-04-09 16:19:04

1

你的第二个例子调用“text”属性的setter。

您的第一个示例使用该字符串的指针,然后在同一范围内更改指针。因此,“文本”没有改变。

顺便说一句:根据您的属性定义的方式,您使用的setter将复制,保留或分配您给setter的值。所以,如果您使用以下命令:

@property(copy) NSString* text; 

然后是的,setter方法,当你调用复制你给它的价值:

myTextArea.text = //some string 
4

的方法stringByReplacing ......不改变的字符串,它会返回一个新的字符串对象(根据命名约定自动释放)。因此,在第二行代码之后,searchText指向完全不同的NSString对象。

此外,NSString对象不能改变,对于有的NSMutableString