Вы также должны определить «изменение»:)
По сути, когда вы создаете строку NSString, вы создаете массив символов и говорите компилятору, что содержимое указанного массива никогда не изменится. Часть «никогда не меняйся» - это «неизменная» часть; данные, содержащиеся в строке, не могут быть изменены.
С другой стороны, NSMutableString позволяет вам фактически изменять данные, на которые он указывает (следовательно, он 'изменяемый'). Обратите внимание на метод 'appendString', который существует для NSMutableString; это фактически берет данные и помещает их в конец строки.
Например, если у вас было:
NSString * myString = @ "Cat";
myString = @ "Золотая рыбка";
Это бы хорошо работало. Вы никогда не меняете данные, которые содержит myString; вы просто говорите, что хотите, чтобы он указывал на новый сегмент неизменяемых данных.
Единственный раз, когда вы действительно столкнетесь с проблемами, связанными с различиями между изменяемыми и неизменяемыми объектами, это если вы попытаетесь на самом деле изменить myString напрямую (например, добавьте «круто» для него или чего-то еще).
Другими словами, любой класс позволил бы вам «изменить» любую строку на любую другую строку, но методы, которые вы использовали для этого, были бы совсем другими. Например, чтобы превратить «cat» в «CAT» с изменяемой строкой, вы можете перебирать каждый символ и просто вводить его в верхнем регистре (поскольку вы можете изменять содержимое изменяемой строки). С другой стороны, с неизменяемой строкой вам придется сначала скопировать исходную строку в другое место, изменить ее, а затем перенаправить переменную, чтобы она указала на эту новую строку NSString.
Следующие ссылки могут быть полезны:
http://www.kirupa.com/forum/showthread.php?t=307928
http://forums.macrumors.com/showthread.php?t=467099
Я бы также порекомендовал заняться поиском; это вопрос, который относится к развитию в целом, и это относительно важная концепция для понимания. Это также обсуждалось до смерти в другом месте в Интернете.