2011-04-08 21 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