Что на самом деле делает присвоение литеральной строки NSString с "="? - PullRequest
8 голосов
/ 13 января 2010

Что на самом деле делает следующая строка?

string = @"Some text";

Предполагая, что "строка" объявлена ​​таким образом в заголовке:

NSString *string;

Что на самом деле здесь делает "="? Что это делает для подсчета ссылок на «строку»? В частности, предполагая, что по какой-то причине «строка» не назначена иным образом, нужно ли ее освобождать?

Спасибо!

Ответы [ 3 ]

20 голосов
/ 13 января 2010

Назначение только это. Указатель string - это в основном метка, которая указывает на определенный адрес в памяти. Оператор переназначения будет указывать эту метку на другой адрес в памяти!

Это не меняет подсчет ссылок и не делает ничего кроме этого в Objective-C. Вам нужно самостоятельно вести подсчет ссылок, если вы работаете в среде без сборки мусора:

[string release];
string = [@"Some text" retain];

Однако, строковыми литералами не нужно управлять, так как они распределяются статически и никогда не освобождаются! Таким образом, методы release и retain являются просто NOOP (то есть без операций). Вы можете спокойно их пропустить.

2 голосов
/ 14 января 2010

Что на самом деле делает следующая строка?

string = @"Some text";

Предполагая, что "строка" объявлена ​​таким образом в заголовке:

NSString *string;

Что на самом деле здесь делает "="? Что он делает со счетчиком ссылок "string"?

string не является строкой.

string на самом деле также не является каким-либо другим видом объекта Какао.

string - это переменная, которую вы создали для хранения экземпляра NSString. Оператор присваивания помещает что-то в переменную *. В приведенном выше примере вы создаете литеральную строку и помещаете ее в переменную.

Поскольку string является переменной, а не объектом Какао, у нее нет счетчика ссылок.

Назначение объекта где-либо может продлить срок службы объекта в собранном мусоре (только на Mac). Подробнее см. Руководство по программированию управления памятью для какао .

* Или массив C. Не путайте их с массивами Какао; они не взаимозаменяемы, и вы не можете использовать оператор присваивания, чтобы поместить вещи в коллекцию Какао (во всяком случае, не в Objective-C).

0 голосов
/ 13 января 2010

Когда вы используете литерал, как в этом случае, это просто синтаксический сахар для быстрого создания объекта NSString. После создания объект ведет себя так же, как другой. Разница здесь в том, что ваша строка компилируется в программу, а не создается динамически.

...