Что делает присвоение литеральной строки к NSString с “=”, на самом деле делают?

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

string = @"Some text";

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

NSString *string;

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

Спасибо!

8
задан René Hoffmann 17 November 2017 в 10:38
поделиться

3 ответа

Можно назначить ему значение, специфичное для экземпляра объекта, что невозможно сделать со статической переменной класса.

-121--1886442-

Две причины:

1) С точки зрения класса проектировать он позволяет программисту полагаться на то, что поле не изменится с момента создания экземпляра - так называемый « неизменяемый объект ». В учебном пособии Java говорится:

Незаменимые объекты особенно полезны в параллельных приложениях. Поскольку они не могут изменять состояние, они не могут быть повреждены в результате пересечения потоков или обнаружены в несогласованном состоянии.

Неизменяемые объекты являются краеугольным камнем различных стилей программирования, например, чистого функционального программирования.

2) Вторая причина - оптимизация JVM. Если все поля являются окончательными, то JVM знает, что состояние объекта не может быть изменено, и, таким образом, может выполнять множество оптимизаций, например, пропускать проверки безопасности резьбы и т.д.

-121--1886440-

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

Он не изменяет счет ссылок и не делает ничего сверх этого в Objective-C. Если вы работаете в среде, не связанной с сбором мусора:

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

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

20
ответ дан 5 December 2019 в 07:35
поделиться

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

0
ответ дан 5 December 2019 в 07:35
поделиться

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

 String = @ «Некоторые текст»;
 

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

 NSString * String;
 

Что делает здесь «=» здесь? Что это делает для «строки» ссылочного значения?

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

Строка , на самом деле, ни один другой вид объекта какао.

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

С строки - это переменная, а не объект какао, он не имеет ссылок.

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

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

2
ответ дан 5 December 2019 в 07:35
поделиться