Const vs static NSStrings в Objective-C
Эти строки находятся в файле реализации над объявлением @implementation
.
NSString * const aVar = @"aVarStringValue";
static NSString *aVar = @"aVarStringValue";
Насколько я понимаю, второй static
выделяется один раз только за время жизни приложения, и этот факт способствует повышению производительности.
Но означает ли это, что это, по сути, утечка памяти, поскольку этот блок памяти никогда не будет выпущен?
И делает ли первое объявление const
распределенным при каждом обращении к нему?
Ответы
Ответ 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
-
является классификатором типа (является частью типа)
-
ключевое слово, примененное к непосредственному левому экземпляру - т.е.
-
Левое использование - применяется к типу объекта, а не переменной
-
const MyObj * myVar;
- неквалифицированный указатель на тип объекта со специфицированным контентом
ТАКИМ:
static NSString * const myVar;
- постоянный указатель на неизменяемую строку с внутренней связью.
Отсутствие ключевого слова static
сделает глобальное имя переменной и может привести к конфликтам имен в приложении.