[英]Objective-c pointers and NSString
如果我有此代碼,為什么textview的文本不更新? 據我所知,*表示指針,而我還沒有復制。
NSString *searchText = myTextView.text;
searchText = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"];
那么為什么myTextView的文本沒有像我一樣更改:
myTextView.text = [searchText stringByReplacingOccurrencesOfString:@" " withString:@";"];
以及如何編寫代碼,以便第一個代碼示例按預期工作?
方法stringByReplacing ...不更改字符串,它返回一個新的字符串對象(根據命名約定自動釋放)。 因此,在第二行代碼之后,searchText指向完全不同的NSString對象。
此外,NSString對象無法更改,因為那里有NSMutableString
如果希望修改myTextView.text
,則必須像第二個示例一樣編寫它,並將新值分配給要修改的屬性。 將新值分配給其他變量或屬性將無法完成任務-當最終使用量子計算時,“ 遠距離的怪異動作 ”可能會起作用,但目前為止還沒有。 :-)
擴大一點:是的, searchText
是一個指針。 但是myTextView.text
,當您執行“ searchText = myTextView.text
”時,您並沒有在兩者之間建立任何持久的關系-您所做的只是使searchText
指向與myTextView.text
相同的目標。 。 在那一點之后更改其中任何一個都不會影響另一個。 所以,當您分配的結果stringByReplacing...
到searchText
,你讓只有它指向一個不同的目標。
第二個示例調用“文本”屬性的設置器。
您的第一個示例使用字符串的指針,然后在相同范圍內更改指針。 因此,“文本”不變。
順便說一句:根據屬性的定義,您使用的設置器將復制,保留或分配給設置器的值。 因此,如果使用以下命令:
@property(copy) NSString* text;
然后,是的,設置器將在調用時復制您提供的值:
myTextArea.text = //some string
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.