Многие объектные типы Objective-C имеют низкоуровневые аналоги С, вместе с функциями С для работы с ними.

Например, помимо NSString, в Objective-C имеется нечто, именуемое CFString; “CF” означает “Core Foundation” и представляет собой низкоуровневый интерфейс API на основе С. CFString является “непрозрачной” структурой С; “непрозрачная” означает, что элементы, составляющие эту структуру, держатся в секрете и что вы должны работать с CFString только с помощью соответствующих функций С. Как и в случае NSString или любого другого объекта, в коде вы обычно обращаетесь к CFString через указатель С; указатель на CFString имеет имя типа CFStringRef.

При случае можно решить работать с таким типом даже тогда, когда существует соответствующий объектный тип. Например, может выясниться, что NSString, при всей его мощи, не обеспечивает некоторую необходимую часть функциональности, которая доступна для CFString. К счастью, NSString (значение, типизированное как NSString*) и CFString (значение CFStringRef) являются взаимозаменяемыми: вы можете использовать один из типов там, где ожидается другой, хотя, чтобы успокоить компилятор, может потребоваться приведение типов. Эта взаимозаменяемость описана и в документации.

Для иллюстрации я использую CFString для преобразования строки NSString, представляющей целое значение, в целое число (для этого не так уж необходимо применять CFString, и я делаю это только в иллюстративных целях; тип NSString имеет решающий эту задачу метод intValue):

NSString* answer = @"42";
int ans = CFStringGetlntValue((CFStringRef)answer);

Объектные типы С, представляющие собой указатели на структуры, обычно имеют имена, заканчивающиеся на “Ref”, и которые можно в целом именовать как CFiypeRef, в действительности представляют собой обобщенный указатель на void. Таким образом, можно использовать упомянутую выше взаимозаменяемость типов как приведение типов между объектными и обобщенными указателями, т.е. от id к void* или от void* к id. Даже там, где взаимозаменяемости между конкретными типами (как между типами NSString и CFString) нет, всегда можно обеспечить взаимозаменяемость с верхним уровнем иерархии, т.е. между id или NSObject (базовый класс объекта, см. главу 4) и CFTypeRef.


 

 

 

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