Чтение онлайн

ЖАНРЫ

Программирование на Objective-C 2.0
Шрифт:

Как часть константного выражения можно использовать специальный оператор defined. Например, при использовании #if defined (DEBUG) ... #endif

будет обрабатываться код между «if и «endif, если ранее был определен иденти-фикатор DEBUG (см. также «ifdef в следующем разделе). Идентификатор не обя-зательно заключать в круглые скобки, то есть #if defined DEBUG

действует точно так же. Директива #ifdef

Общий формат #ifdef идентификатор ... #endif

Если значение идентификатора было ранее определено (с помощью «define или опции командной строки -D при компиляции программы), то обрабатываются все строки программы до «endif; в противном случае они пропускаются. Как и в случае директивы «if, с директивой «ifdef можно использовать директивы #elif и «else. Директива #ifndef

Общий формат #ifndef идентификатор ... #endif

Если значение идентификатора не было ранее определено, то обрабатываются все строки программы

до «endif; в противном случае они пропускаются. Как и в случае директивы «if, с директивой «ifndef можно использовать директивы #elif и «else. Директива # import Формат 1 #import "имяФайла"

Если файл имяФайла был ранее включен в программу, этот оператор пропус-кается. В противном случае препроцессор ищет сначала файл имяФайла в папках, которые определены реализацией. Обычно поиск начинается с той же папки, где содержится исходный файл, и если файл не найден, то выполняется поиск в последовательности стандартных мест, определенных реализацией. После того, как файл найден, его содержимое включается в программу в том месте, где находится директива «import. Препроцессорные директивы, содержащиеся во включенном файле, тоже анализируются. Поэтому сам включенный файл может содержать другие директивы «import или #include. Формат 2 #import <имяФайла>

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

При любом формате можно указать определенное ранее имя, после чего происходит раскрытие этого имени. Например, можно использовать следующую последовательность. #define ROOTOBJECT <NSObject.h> ... #import ROOTOBJECT Директива #include

Эта директива действует таким же образом, как #import, но не выполняется проверка предшествующего включения указанного header-файла. Директива #line

Общий формат #line константа "имяФайла"

Эта директива указывает компилятору, что последующие строки программы нужно обрабатывать в предположении, что имя исходного файла — имяФайла и что отсчет номеров строк во всех последующих строках начинается с константы. Если имяФайла не указано, то используется имя файла, указанное последней директивой «line, или имя исходного файла (если ранее не было указано никакого имени файла).

Директива «line в основном используется для задания имени файла и номера строки, которые выводятся при выдаче ошибки компилятором. Директива # pragma

Общий формат #pragma текст

Препроцессор выполнит некоторые действия, определенные реализацией. Например, «pragma loop_opt(on)

вызывает специальную оптимизацию циклов в определенном компиляторе. Если эту директиву встретит компилятор, который не распознает указание loop_opt, то она будет игнорироваться. Директива #undef

Общий формат #undef идентификатор

Указанный идентификатор станиишен неопределенным для препроцессора. Последующие директивы #ifdef или «ifndef действуют так, как будто данный иден-тификатор никогда не был определен. Директива \

Это null-директива, и она игнорируется препроцессором. Заранее определенные идентификаторы

Следующие идентификаторы определены препроцессором. Идентификатор Описание LINE Номер текущей компилируемой строки. FILE Имя текущего компилируемого исходною файла. DATE Дата компилируемого файла в формате Мм дд гггг. TIME Время компилируемого файла в формате «чч:мм:сс». STDC Определен как 1, если компилятор согласуется со стандартом ANSI, и 0 в противном случае. STDC_H0STED Определен как 1, если данная реализация поддерживается (hosted), и 0 в противном случае. STDC_VERSION Определен как 199901L.

Приложение С. Исходный код адресной книги

В справочных целях здесь приводятся в полном виде файлы секций interface и implementation для примера адресной книги, с которым мы работали в части II. Сюда включены определения классов AddressCard и AddressBook. Вы должны реализовать эти классы на своем компьютере; затем определения этих классов нужно расширить, чтобы сделать их более применимыми и усилить их возможности. Для нас это станет превосходным способом изучения языка и ознакомления с созданием программ, работой с классами и объектами, а также работой с Foundation framework. Файл секции interface для AddressCard #import <Foundation/Foundation.h> @interface AddressCard : NSObject <NSCopying, NSCoding> { NSString *name; NSString *email; } @property (nonatomic, copy) NSString *name, *email; -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail; -(void) retainName: (NSString *) theName andEmail: (NSString *) theEmail; -(NSComparisonResult) compareNames: (id) element; -(void) print; @end Файл секции interface для AddressBook #import <Foundation/Foundation.h> #import "AddressCard.h" @interface AddressBook: NSObject <NSCopying, NSCoding> { NSString *bookName; NSMutableArray *book; } @property (nonatomic, copy) NSString *bookName; @property (nonatomic, copy) NSMutableArray *book; -(id) initWithName: (NSString *) name; -(void) sort; -(void) addCard: (AddressCard *) theCard; -(void) removeCard: (AddressCard *) theCard; -(int) entries; -(void) list; -(AddressCard *) lookup: (NSString *) theName; -(void) dealloc; @end Файл

секции implementation для AddressCard
#import "AddressCard.h" @implementation AddressCard @synthesize name, email; -(void) setName: (NSString *) theName andEmail: (NSString *) theEmail ( [seif setName: theName]; [self setEmail: theEmail]; } // Сравнение двух имен из указанных адресных карточек -(NSComparisonResult) compareNames: (id) element { return [name compare: [element name]]; } -(void) print { NSLog (@"============================"); NSLog (@"[ ]"); NSLog (@"| %-31s ]", [name UTF8String]); NSLog (@"| %-31s ]" , [email LFTFSString]); NSLog (@"[ ]"); NSLog (@"[ ]"); NSLog (@"[ ]"); NSLog (@"[ O O ]"); NSLog (@"============================"); } -(AddressCard *) copyWithZone: (NSZone *) zone { AddressCard *newCard = [[AddressCard allocWithZone: zone] init]; [newCard retainName: name andEmail: email]; return newCard; -(void) retainName: (NSString *) theName andEmail: (NSString *) theEmail { name = [theName retain]; email = [theEmail retain]; -(void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject: name forKey: @"AddressCardName"]; [encoder encodeObject: email forKey: @"AddressCardEmail"]; -(id) initWithCoder: (NSCoder *) decoder { name = [[decoder decodeObjectForKey: @"AddressCardName"] retain]; email = [[decoder decodeObjectForKey: @"AddressCardEmail"] retain]; return self; } -(void) dealloc { [name release]; [email release]; [super dealloc]; } @end Файл секции implementation для AddressBook #import "AddressBook.if @implementation AddressBook @synthesize book, bookName; // задание имени адресной книги и пустой книги -(id) initWithName: (NSString *) name{ self = [super init]; if (self) { bookName = [[NSString alloc] initWithString: name]; book = [[NSMutableArray alloc] init]; } return self; } -(void) sort { [book sortUsingSelector: @selector(compareNames:)]; } -(void) addCard: (AddressCard *) theCard { [book addObject: theCard]; } -(void) removeCard: (AddressCard *) theCard { [book removeObjectldenticalTo: theCard]; } -(int) entries { return [book count]; } -(void) list { NSLog (@"======== Contents of: %@ =========", bookName); for (AddressCard "theCard in book ) NSLog (@"%-20s %-32s", [theCard.name UTF8String], [theCard.email UTF8String]); NSLog (@"============================================n); } // поиск адресной карточки по имени - требуется точное совпадение -{AddressCard *) lookup: (NSString *) theName { for ( AddressCard *nextCard in book ) if ( [[nextCard name] caselnsensitiveCompare: theName] == NSOrderedSame ) return nextCard; return nil; } -(void) dealloc { [bookName release]; [book release]; [super dealloc]; } -(void) encodeWithCoder: (NSCoder *) encoder { [encoder encodeObject:bookName forKey: @"AddressBookBookName"]; [encoder encodeObject:book forKey: @"AddressBookBook"]; } -(id) initWithCoder: (NSCoder *) decoder ( bookName = [[decoder decodeObjectForKey: @"AddressBookBookName"] retain]; book = [[decoder decodeObjectForKey: @"AddressBookBook"] retain]; return self; } // Метод для протокола NSCopying -(id) copyWithZone: (NSZone *) zone { AddressBook *newBook = [(self class] allocWithZone: zone]; [newBook initWithName: bookName]; [newBook setBook: book]; return newBook; } @end

Приложение D. Ресурсы

В этом приложении содержится список некоторых ресурсов с дополнительной информацией. Мы собрали здесь ресурсы, посвященные программированию на языке С, Objective-C, в Cocoa и для iPhone/iTouch. Этот список послужит хорошей отправной точкой для поиска нужной информации. Ответы на вопросы упражнений, опечатки и пр.

На веб-сайте издателя www.informh.com/register вы можете найти ответы на уп-ражнения. Язык Objective-C

К этим ресурсам вы можете обратиться за дополнительной информацией но языку Objective-C. Книги

Objective-C 2.0 Programming Language (Язык программирования Objective- С). Apple Computer, Inc., 2008. Лучший из имеющихся справочников по языку Objective-C. Мы рекомендуем обратиться к нему после завершения работы с этой книгой. Доступ к тексту книги можно получить в окне Xcode Не1р-> Documentation или в Интернете на веб-сайте Apple. Pdf-версия находится по ссылке: http://deveioper.appk.com/documenta-tion/Cocoa/Conceptual/ObjectiveC/OhjC.pdf.

Object-Oriented Programming: An Evolutionary Approach (Объектно-ориенти-рованное программирование: эволюционный подход), Second Edition. Brad Cox and Andy Novobilski. Addison-Wcsley, 1991. Первоисточник всех сведений no Objective-C. Бред Кокс, разработчик этого языка, был одним из авторов этой книги.

Objective-C Pocket Reference (Карманный справочник по Objective-C). Andrew М. Duncan. O’Reilly Associates Inc., 2003. Краткий справочник по языку Objective-C. Веб-сайты

Поделиться с друзьями: