2009-08-15 2 views
1

Я читал, что, когда в соответствии с протоколом NSCoding и реализации методов, как -encodeWithCoder :, и объекты кодирования с т.е.Всегда ли константы сохраняют одно и то же значение?

[coder encodeObject:self.someObject forKey:kSomeConstantToIdentifyFields]; 

Эта константа используется для отслеживания этого объекта. Таким образом, позже с помощью этой константы соответствующее «поле» или что-то еще может быть отображено на этот объект снова (в данном случае это свойство).

Но: Разве эта смешная константа фактически не является случайной величиной, если она определена так?

#define kSomeConstantToIdentifyFields @"fieldFooBar" 

Как система управляет им, чтобы всегда назначать такое же значение этой константе? Или я получил некоторые вещи об этих константах неправильно? Является ли значение фактически «fieldFooBar», а не каким-то случайным числом?

ответ

4

Ключ - это строка - имя, если вы хотите, - которое идентифицирует поле в словаре. В этом случае словарь - это то, что будет написано или прочитано из архива, созданного по протоколу NSCoding.

Когда вы определяете такой ключ, он не обязательно является постоянным, потому что он может быть изменен в какой-то момент (но только преднамеренно, а не случайно системой). До тех пор, пока вы не измените строку @ fieldFooBar, она останется такой же на протяжении всей жизни программы.

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

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

+1

Отличное объяснение причин для определения констант – gnarf

+0

Очень полезный ответ!+1 –

-1

Всегда ли константы сохраняют то же значение ?

Я считаю, что именно поэтому их называют константой s. ; o)

1

Перед компиляцией приложения выполняется процесс предварительной компиляции. Директива #define key value сообщает предкомпилятору «всякий раз, когда вы видите ключ, замените его на значение». Дело не только в том, что они константы; это как если бы вы написали @"fieldFooBar" по всему вашему приложению.

Причина, по которой не сделать это самостоятельно - это избежать ошибок, и я думаю, что Джасариен дал большое объяснение этому в своем ответе.

1

Лучший способ определить строковые константы является использование

static NSString *kSomeConstantToIdentifyFields = @"fieldFooBar"; 

Это было бы то же самое вам некоторые памяти. Кроме того, я полагаю, что isEqual: chects указатель объекта, поэтому наличие всех констант указывает на одно место.

+0

На самом деле isEqual из NSString также проверяет значение ... –

+1

GCC объединяет постоянные NSStrings, которые имеют одинаковое значение, поэтому нет дополнительных накладных расходов на использование #define вместо статического (GCC также будет делать это для CFSTR и стандартные строки C) – rpetrich

Смежные вопросы