const против статических строк NSS в Objective-C - PullRequest
44 голосов
/ 28 ноября 2009

Обе строки находятся в файле реализации над объявлением @implementation.

NSString * const aVar = @"aVarStringValue";

static NSString *aVar = @"aVarStringValue";

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

Но означает ли это, что это, по сути, утечка памяти, поскольку этот блок памяти никогда не освободится?

И выделяется ли первое const объявление каждый раз, когда к нему обращаются в отличие?

Ответы [ 3 ]

98 голосов
/ 28 ноября 2009
Ключевое слово

static в Objective-C (и C / C ++) указывает на видимость переменной. Статическая переменная (не в методе) может быть доступна только в этом конкретном файле .m. Статическая локальная переменная, с другой стороны, выделяется только один раз.

const, с другой стороны, указывает, что ссылка не может быть изменена и / или переназначена; и является ортогональным относительно того, как это может быть создано (хотя компиляторы могут оптимизировать conts).

Стоит отметить, что литералы NSString инициализируются и никогда не уничтожаются при жизни приложения. Они размещены в доступной только для чтения части памяти.

49 голосов
/ 28 ноября 2009

static только изменяет область действия переменной, а не то, как она объявлена ​​или сохранена.

В обоих случаях компилятор создаст постоянную версию экземпляра NSString, которая хранится в файле mach-o. Таким образом, существует только один экземпляр того или другого (обратите внимание, что вы можете изменить поведение, чтобы динамически создавать строку при загрузке mach-o, но есть только один экземпляр).

static просто помечает переменную aVar как видимую в области действия модуля компиляции - только для файла. Без static вы можете переопределить строку как extern NSString *aVar; в заголовке и получить к ней доступ из любого места.

const является ортогональным и, в случае NSString, ссылка в значительной степени не имеет значения.

5 голосов
/ 11 мая 2016

Чтобы разрешить все возможные дискуссии о необходимости static и позиции const:

Согласно спецификации C99 / GNU99 (которая обычно используется для кода Objective-C):

  • static

    • - спецификатор класса хранения

    • объекты области действия уровня файла по умолчанию имеют внешнюю связь

    • объекты области уровня файла со статическим спецификатором имеют внутреннюю связь
  • const

    • является квалификатором типа (является частью типа)

    • ключевое слово, примененное к непосредственному левому экземпляру - т.е.

      • MyObj const * myVar; - неквалифицированный указатель на постоянный квалифицированный тип объекта

      • MyObj * const myVar; - постоянный квалифицированный указатель на неквалифицированный тип объекта

    • Самое левое использование - применяется к типу объекта, не переменному

      • const MyObj * myVar; - неквалифицированный указатель на квалифицированный тип объекта const

THUS:

static NSString * const myVar; - постоянный указатель на неизменяемую строку с внутренней связью.

Отсутствие ключевого слова static сделает имя переменной глобальным и может привести к конфликтам имен в приложении.

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