Тип данных переменной может быть объявлен с квалификатором перед именем типа. Это добавление влияет на то, как эта переменная может использоваться в программе.

Например, объявлению может предшествовать слово const, которое означает (K&R 2.4), что изменять значение этой переменной нельзя; такая переменная должна быть инициализирована в той же строке объявления, и это единственное значение, которое она может иметь в программе.

Переменную, объявленную как const, можно использовать как альтернативный способ (вместо #def ine) предотвратить использование “магических чисел” и аналогичных выражений. Например:

NSString* const MYKEY = @"Howdy";

Интерфейс API каркаса Cocoa сам часто использует эту возможность. Например, в некоторых случаях каркас Cocoa передает вашему коду словарь с информацией. Документация сообщает, какие именно ключи содержит словарь. Но вместо того, чтобы передать вам ключи в виде строковых литералов, документация передает ключ как имя переменной типа const NSString:

UIKIT_EXTERN NSString *const
UIApplicationStatusBarOrientationUserlnfoKey;

(Сейчас неважно, что означает UIKIT_EXTERN.) Это объявление говорит вам, что UIAp plicationStatusBarOrientationUserlnfoKey является именем строки NSString и что вы можете довериться ее значению. Вы должны использовать это имя, когда вам нужен этот конкретный ключ. Вы можете быть уверены в том, что будет использовано нужное вам фактическое значение строки, несмотря на то, что вы не знаете, что это за значение. Если же вы допустите ошибку при вводе имени переменной, компилятор сообщит вам об ошибке, потому что вы будете пытаться использовать имя не определенной переменной.

Еще одним распространенным квалификатором является static. К сожалению, это ключевое слово используется в языке программирования С двумя способами; способ, которым

обычно пользуюсь я, применим в функции или методе. Здесь static указывает, что память, выделенная для переменной, не освобождается после возврата из функции или метода; переменная, таким образом, хранит свое значение до следующего вызова функции или метода. Статическая переменная полезна, например, когда вы хотите вызывать функцию многократно без накладных расходов на вычисление результата всякий раз заново (после первого вызова). Сначала проверим, вычислено ли уже значение статической переменной: если нет, то это должен быть первый вызов функции, и следует вычислить значение переменной; если же она уже вычислена, надо просто ее вернуть. Вот схема такого применения статической переменной:

int myfunctionО {
static int result = 0; // 0 означает, что вычислений // еще не было
if (result == 0) {
// Вычисляем и сохраняем результат
}
return result;
}

Очень распространено использование статической переменной в Objective-C для реализации синглтона — единственного экземпляра класса, возвращаемого методом фабрики класса. Звучит пугающе, но не бойтесь — это не страшно. Ниже приведен пример из моего собственного кода, который вы можете понять, несмотря на то, что мы еще не обсуждали Objective-C.

+ (CardPainter*) sharedPainter { static CardPainter* sp = nil; if (nil -= sp)
sp = [CardPainter new]; return sp;
}

Этот код гласит: если экземпляр sp типа CardPainter не был создан, его следует создать, и в любом случае его следует вернуть. Таким образом, независимо от того, сколько раз был вызван метод, экземпляр создается только один раз, и при каждом вызове возвращается одно и то же значение.

Статические переменные являются возможностью языка С, но не языка Objective-C. Таким образом, статическая переменная не знает ничего о классах и экземплярах; даже если она находится внутри функции или метода, она определена на уровне файла, что по сути означает — на уровне вашей программы в целом. Все в порядке, когда вы используете ее в методе фабрики класса, потому что класс является уникальным для вашей программы в целом. Но никогда не используйте статическую переменную в методе экземпляра Objective-С, потому что ваша программа может иметь несколько таких экземпляров и значение этой одной статической переменной будет использоваться во всех них. Другими словами, не используйте статическую переменную С как заменитель переменной экземпляра Objective-C (глава 2). Я однажды сделал эту ошибку, и, поверьте, этого урока мне вполне хватило.


Похожие статьи

 

 

 

 
 

У вас нет прав оставлять комментарии. Зарегистрируйтесь на сайте.