Использование статики в Objective-c


Примечание: мой вопрос не связан с этим.

Помимо того, что переменная не видна вне файла, в котором она объявлена, с точки зрения выделения памяти , Есть ли какая-либо разница между объявлением этого (вне метода):

NSString *const kMyConstant = @"Hello World";

Или вот это:

static NSString *const kMyConstant = @"Hello World";
4 7

4 ответа:

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

Нет, это просто влияет на видимость объекта вне блока компиляции.

это также может быть достигнуто с помощью:

__attribute__ ((visibility ("hidden")) NSString *const kMyConstant = @"Hello World";

EDIT , то есть cobblers; атрибут visibility hidden влияет на видимость вне общего объекта, а не блока компиляции.

Я думаю, что это очень интересный вопрос, поскольку он показывает некоторое ясное и понятное управление константами с одной стороны и некоторые очевидные исключения, которые включают Objective C и clang при обработке констант класса NSString.

Я полагаю, что применимо следующее:

Приведенные выше объявления и инициализации из вопроса не имеют никакого значения для управления памятью. Его просто не существует на самом деле. Константы просто включены в пакет и не выделяются в классическом условия. Это означает, что значение из класса object указывает на место в памяти пакета, где находится строковая константа. Вы можете легко узнать это при сравнении адреса такой строки NSString и ее класса объектов. Строковый адрес очень низок, указывая на диапазон адресов расположения пакета. Вы можете видеть, что адреса других строк, которые были инициализированы в коде, указывают на очень разные местоположения. Objective C runtime не выполняет никакого управления памятью на строковых константах, так как это было бы довольно неудобно "выпускать" или удалять что-то из пачки. Поэтому, если вы поиграете с этим в среде без дуги, вы увидите, что сохранение и освобождение просто игнорируются.

Чтобы закончить это, ответьте на вопрос: нет, нет никакой разницы в управлении памятью в обоих случаях. Это просто не делается. Память выделяется пакетом и освобождается ОС, когда приложение заканчивается. Это относится не только к объявлениям и назначению явных констант вне реализации, но и внутри любой метод.

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