Когда вы выделяете объект, его счет начинается с 1. Каждый раз, когда вы сохраняете, он увеличивается на единицу, а каждый раз, когда вы отпускаете, он уменьшается на единицу. Другим фактором здесь является авто-релиз. Когда объект автоматически освобождается в контексте пула автоматического выпуска, его количество сохранений автоматически уменьшается на единицу при сливе пула автоматического выпуска.
В ваших примерах name1
и newString1
в первом примере будут указателями на один и тот же объект , при этом количество сохраняемых объектов остается неизменным. Это повысится, только если вы явно вызовите retain. То же самое с name2
и newString2
. Во втором примере вы выделяете новый экземпляр объекта NSString, так что новые, anotherString1
и anotherString2
сохранят количество единиц 1. name1
и name2
останутся то же самое, опять же, потому что вы не освободили или не сохранили их.
Ваш второй пример по сути такой же, как copy
. В то время как retain
просто увеличивает счет сохранения объекта, copy
создает новый объект со своим собственным счетом хранения. Связанная вещь, которую нужно пометить, указана в объявлении name1
и name2
в качестве свойств. Если вы установите эти свойства, они будут вести себя так, как я здесь описываю, с name1
, сохраняя NSString
, который вы там установили, и name2
, копируя его как новый объект.
Еще один хороший обзор всего этого - здесь , со ссылкой на еще более подробное обсуждение внизу.
Все это, как говорится, в OS X вы можете использовать сборщик мусора, а в iOS 5 автоматический подсчет ссылок . Это может значительно уменьшить, если не устранить, необходимость беспокоиться об этом.