Objective-c указатели и NSString - PullRequest
1 голос
/ 09 апреля 2011

Если у меня есть этот код, почему текстовое представление не обновляется? Насколько я знал, * означает указатель, а я не сделал копию.

NSString *searchText = myTextView.text;

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

Так почему же текст myTextView не изменился, как если бы я это сделал:

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

А как бы я написал код, чтобы первый пример кода работал так, как я намереваюсь?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

Метод stringByReplacing ... Не изменяет строку, он возвращает новый строковый объект (автоматически выпущенный, в соответствии с соглашениями по именованию) Таким образом, после 2-й строки кода searchText указывает на совершенно другой объект NSString.

Кроме того, объекты NSString не могут быть изменены, для этого есть NSMutableString

2 голосов
/ 09 апреля 2011

Если вы ожидаете изменить myTextView.text, вы должны написать его, как ваш второй пример, и назначить новое значение для свойства, которое вы пытаетесь изменить.Присвоение нового значения некоторой другой переменной или свойству не сработает - « жуткое действие на расстоянии » может сработать, когда у нас в конечном итоге появятся квантовые вычисления, но мы этого еще не сделали.: -)

Чтобы немного расширить: Да, searchText - указатель.Но так же и myTextView.text, и когда вы делаете "searchText = myTextView.text", вы не создаете каких-либо длительных отношений между ними - все, что вы делаете, это заставляете searchText указать на ту же цель, что и myTextView.text,Изменение одного из них после этого не повлияет на другое.Итак, когда вы присваиваете результат stringByReplacing... для searchText, вы делаете это, и только это указывает на другую цель.

1 голос
/ 09 апреля 2011

Ваш второй пример вызывает установщик свойства "text".

Ваш первый пример берет указатель на строку, а затем изменяет указатель в той же области видимости.Следовательно, «текст» не изменяется.

Кстати: в зависимости от того, как определено ваше свойство, используемый вами установщик копирует, сохраняет или присваивает значение, которое вы передаете ему.Поэтому, если вы используете следующее:

@property(copy) NSString* text;

Тогда да, установщик скопирует значение, которое вы дадите ему при вызове:

myTextArea.text = //some string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...