В языке С, а следовательно, и в Objective-C, переменную разрешается объявлять за пределами любого метода. В книге K&R (см. лаву 1) такая переменная называется внешней (см. K&R, раздел 4.3), а я называю ее глобальной переменной.

Обычно принято, хотя и не строго обязательно, уточнять объявление такой переменной как static. Такое уточнение имеет отношение к области действия переменной и не оказывает влияния на ее сохраняемость или глобальный характер.

Глобальные переменные относятся к типу переменных языка С, определяемому на уровне файла. Им ничего неизвестно об экземплярах. В той степени, в какой глобальные переменные имеют отношение к объектно-ориентированному программированию, они могут быть определены в файле класса, а следовательно, они, по существу, являются переменными уровня класса. В коде Objective-C глобальная переменная зачастую используется как константа. Иногда глобальную переменную можно инициализировать при ее объявлении, как показано ниже.

 

NSString* const MYSTRING = @"my string";

Если само значение, которое требуется присвоить глобальной переменной, не является константой, то его придется присваивать в конкретном коде, и тогда возникает вопрос: где разметить такой код? Глобальная переменная, по существу, является переменной уровня класса, и поэтому ее целесообразно инициализировать на ранней стадии существования класса, т.е. в методе initialize (см. главу 11).

Если значение глобальной переменной определяется на уровне класса, то оно сохраняется в течение всего времени работы программы. Глобальные переменные не имеют никакого отношения к управлению памятью, выделяемой для экземпляров, поскольку они никак не связаны с экземплярами. В каком-то смысле можно говорить об утечке глобальных переменных из памяти, но следует подчеркнуть, что это происходит так же безвредно, как и утечка объектов классов.

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


 

 

 

Добавить комментарий