Подтвердить что ты не робот

Const vs static NSStrings в Objective-C

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

NSString * const aVar = @"aVarStringValue";

static NSString *aVar = @"aVarStringValue";

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

  • static

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

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

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

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

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

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

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

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

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

ТАКИМ:

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

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