Когда вы делаете:
NSString *myString = @"Hello, World";
NSString *anotherString = myString;
... вы создаете один экземпляр NSString
и два указателя на него.Так что, чтобы ответить на ваши вопросы, нет, это не копируется.Да, anotherString
- это просто указатель, как и myString
, фактический экземпляр NSString
отключен в области памяти по адресу, на который сейчас указывают оба указателя.
Чтобы создатькопию строки вы должны сделать:
NSString *anotherString = [myString copy];
Когда вы выполните:
[anotherString release];
Экземпляр NSString
, на который указывает anotherString
, освобождается.Ничего не происходит с anotherString
.Он продолжает указывать на ваш теперь недействительный экземпляр объекта.Если myString
указывал на тот же экземпляр, то да, это заставляет myString
также «уходить».
И если вы делаете:
anotherString = nil;
...затем вы вызвали утечку памяти, потому что вы переназначили указатель, не отпуская то, на что он указывал.За исключением случаев, когда это не так, потому что @"Hello, World"
является литеральным значением, которое загружается в стек и не сохраняется вашим кодом.
В любом случае, установка anotherString
в nil
не повлияет на вашу строку, он просто меняет то, на что указывает anotherString
.Ваш фактический NSString
экземпляр все еще отключен в памяти, совершенно не подозревая, что вы просто выбросили свою ссылку на него (возможное исключение: подсчет ссылок / сборщик мусора).
И да, вызов [object release]
случайно вызовет сбои.Как правило, вам следует звонить на номер release
только в том случае, если:
- Вы позвонили
alloc
и init...
на него. - Вы позвонили
retain
на него. - Вы получили объект в результате вызова
copy
на каком-то другом объекте.
Обратите внимание, что это стек, поэтому, если вы alloc
что-то, retain
it,а затем copy
это, вам нужно сделать 3 вызова на release
, два для объекта, который вы alloc
'редактировали, и один для копии.
В качестве примечания вы можете найтипроще написать ваши объявления объектов, например:
NSString* myString = @"Hello, World";
NSString* anotherString = myString;
... что делает более очевидным, что вы объявляете указатели на NSString, а не сами NSString.Лично я думаю, что ваш оригинальный синтаксис, хотя и широко используется, также назад .