2009-08-21 3 views
1

У меня есть NSString, и я хочу записать его значение в NSMutableString. Является ли это действительно:Cocoa String Вопрос

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

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

ответ

10

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

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

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

С mutableCopy содержит «копию», затем вам нужно управлять памятью новой строкой (вы берете ее на себя в соответствии с Apple Object Ownership Policy).

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

5

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

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

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