статические строки NSS в Objective-C - PullRequest
6 голосов
/ 22 мая 2010

Я часто вижу такой фрагмент кода в методах экземпляра класса:

static NSString *myString = @"This is a string.";

Я не могу понять, почему это работает. Это просто объектный эквивалент #define, ограниченный областью действия метода? Я (думаю) я понимаю статическую природу переменной, но более конкретно о NSStrings, почему она не выделяется, init'd?

Спасибо ~

Ответы [ 5 ]

9 голосов
/ 22 мая 2010

Я думаю, что вопрос состоит из двух не связанных между собой частей.

Одна из причин, по которой он не выделяется и не инициируется. Ответ заключается в том, что когда вы пишете строковый литерал Objective C в форме @"foo", компилятор Objective C создаст для вас экземпляр NSString.

Другой вопрос, что делает модификатор static. Он делает то же самое, что и в функции C, гарантируя, что переменная myString одинакова при каждом использовании метода (даже между различными экземплярами объекта).

Макрос #define - это нечто совершенно другое: это «программная вырезка и вставка» исходного кода, выполняемая до того, как код поступит в компилятор.

4 голосов
/ 24 ноября 2011

Просто наткнулся на ту же самую декларацию static NSString. Я задавался вопросом, как именно работает эта статическая магия, поэтому я немного прочитал. Я рассмотрю только статическую часть вашего вопроса.

Согласно K & R каждая переменная в C имеет два основных атрибута: type (например, float) и класс хранения (auto, register, static, extern, ЬурейеЕ).

Класс хранения static имеет два различных эффекта в зависимости от того, используется ли он:

  • внутри блока кода (например, внутри функции),
  • вне всех блоков (на том же уровне, что и функция).

Переменная внутри блока , для которого не объявлен класс хранения, по умолчанию считается автоматической (то есть локальной). Он будет удален, как только блок выйдет. Когда вы объявляете автоматическую переменную статической, она сохраняет свое значение при выходе. Это значение останется там, когда блок кода снова будет вызван.

Глобальные переменные (объявленные на том же уровне, что и функция) всегда являются статическими. Явное объявление глобальной переменной (или функции) static ограничивает ее область действия только одним файлом исходного кода. Он не будет доступен и не будет конфликтовать с другими исходными файлами. Это называется внутренняя связь .

Если вы хотите узнать больше, прочитайте внутреннюю и внешнюю связь в C .

2 голосов
/ 24 июня 2010

Вы не видите вызов alloc / init, потому что конструкция @"..." создает строку constant в памяти (через компилятор).

В этомcontext, static означает, что переменная не может быть доступна из файла, в котором она определена.

1 голос
/ 22 мая 2010

Это особый случай инициализации для NSString, который просто указывает указатель NSString на экземпляр, выделенный и инициированный при запуске (или, может быть, лениво, я не уверен.) Существует один из этих экземпляров NSString, созданный таким образом длякаждый уникальный @ "", который вы используете в своей программе.

Также я думаю, что это так, даже если вы не используете ключевое слово static.Кроме того, я думаю, что все другие NSStrings, инициализированные этой строкой, будут указывать на тот же экземпляр (не проблема, потому что они неизменны.)

Это не то же самое, что #define, потому что вы на самом деле имеете переменную NSString, создавстрока с инициализацией = @ "what".Кажется, больше эквивалентно c's const char* somestr = "blah blah blah".

1 голос
/ 22 мая 2010

Для части NSString alloc, init:

Во-первых, я думаю, это можно считать удобством, но оно не одинаково для [[NSString alloc] init].

Я нашел здесь полезную ссылку. Вы можете взглянуть на это NSString и ярлыки

Для части static и #define:

Статический экземпляр в классе означает, что вы можете получить доступ, используя любой экземпляр класса. Вы можете изменить значение статического. Для функции это означает, что значение переменной сохраняется между вызовами функции

# define - вы помещаете макрос-константу, чтобы избежать магического числа и строки, и определяете макросы функций. #define MAX_NUMBER 100. тогда вы можете использовать int [MAX_MUMBER]. Когда код скомпилирован, он будет скопирован и вставлен в int [100]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...