NSString *string2 = string1;
Это не создает новый объект. string1
это не объект, это указатель на объект. это назначение просто делает копию указателя и помещает его в string2
.
Из-за подробностей реализации ( внутренняя деталь реализации, которая не может быть верной во всех случаях и на которую никогда не следует полагаться ), это верно:
NSString *string1 = [NSString stringWithString:@"string"];
string1 == @"string"; // this is a true expression
Строковые константы - @ "dddd" - компилируются в двоичный файл компилятором. Они не могут быть освобождены, и есть только одна константа на уникальную строку. stringWithString:
распознает константы и не создает новую копию.
Теперь, если бы вы сделали:
NSMutableString *string1 = [NSMutableString stringWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];
То, что скопирует @ "строку" в новый экземпляр NSMutableString, а строка1 будет указывать на этот объект.
Этот код, тем не менее, будет перевыпущен ([string1 release];
тоже будет), так как stringWithString:
возвращает автоматически выпущенный объект.
Теперь, если бы вы:
NSMutableString *string1 = [[NSMutableString alloc] initWithString:@"string"];
NSMutableString *string2 = string1;
[string2 release];
Тогда этот код является технически правильным с точки зрения количества сохраняемых данных; строковый объект будет освобожден. Но после release
и string1
, и string2
будут висячими указателями - то есть адрес, который они держат, больше не указывает на жизнеспособный объект и пытается сообщение либо приведет к неопределенным результатам.