Вопрос о какао - PullRequest
       28

Вопрос о какао

1 голос
/ 21 августа 2009

У меня есть NSString, и я хочу записать его значение в NSMutableString. Это действительно:

NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = temp;

Я спрашиваю, потому что, хотя это кажется выполнимым, я бы подумал, что это назначило бы и временный, и изменяемый один и тот же адрес. У меня много вопросов при передаче значений в метод или при возврате значений из метода. Иногда я вижу, как другие люди делают это или создают изменяемую строку с помощью stringWithString или initWithString. Спасибо

Ответы [ 2 ]

10 голосов
/ 21 августа 2009

Вы можете использовать метод mutableCopy, который создает изменяемую копию получателя и применяется к любому классу, который принимает протокол NSMutableCopying (одним из которых является NSString):

NSString *temp = [NSString stringWithString:@"test"];
NSMutableString *mutable = [temp mutableCopy];

Это создаст изменчивую копию строки как новый экземпляр строки. В этом случае это не применяется, так как temp является строкой с автоматическим выпуском, но в противном случае вам нужно будет освободить старую строку, копию которой вы сделали, если она вам больше не нужна.

Поскольку mutableCopy содержит «копию», вам необходимо управлять новой строкой в ​​памяти (вы получаете ее в соответствии с Apple Политика владения объектами ).

Метод, который вы использовали, просто назначает mutable в качестве указателя на ранее созданный экземпляр NSString.

5 голосов
/ 21 августа 2009

Одна вещь, которая, кажется, смущает многих людей какао, - это разница между переменными и объектами.

Вы должны иметь в виду, что когда вы объявляете переменную типа NSMutableString *mutable, , вы не создаете строку . Это просто переменная-указатель типа NSMutableString*. Конструктивно он такой же, как и любой другой указатель - и, как следует из термина «указатель», он просто указывает на то, что на самом деле живет в другом месте. Из-за этого вы технически можете назначить его для указания на любой объект. Но вы не превращаете этот объект в изменчивую строку - вы просто лжете о том, на какой объект указывает переменная. После того, как вы попытаетесь отправить объекту сообщение, на которое может ответить только NSMutableString, джиг закончился!

Как сказал Perspx, если у вас есть строка, которую вы хотите изменить, вы можете использовать метод mutableCopy для получения - как вы уже догадались - изменяемой копии. Существует также множество методов NSString, которые не изменяют строку, но позволяют получить новую строку с некоторыми внесенными изменениями (например, stringByAppendingString:). Вы можете пройти довольно длинный путь с ними.

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