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

на главную - закладки

Жанры

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

Если значение идентификатора было ранее определено (с помощью «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. Веб-сайты

Поделиться:
Популярные книги

Ричард Блейд, пэр Айдена

Лорд Джеффри
1. Ричард Блейд. Зрелые годы
Фантастика:
героическая фантастика
7.29
рейтинг книги
Ричард Блейд, пэр Айдена

Аватар

Жгулёв Пётр Николаевич
6. Real-Rpg
Фантастика:
боевая фантастика
5.33
рейтинг книги
Аватар

Итальянский фашизм

Устрялов Николай Васильевич
Научно-образовательная:
история
политика
5.00
рейтинг книги
Итальянский фашизм

Башни полуночи

Сандерсон Брендон
13. Колесо Времени
Фантастика:
фэнтези
8.53
рейтинг книги
Башни полуночи

Катуков против Гудериана

Прудников Виктор
Сражения Великой Отечественной Войны
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Катуков против Гудериана

Гурко. Под стягом Российской империи

Тумасов Борис Евгеньевич
Русские полководцы
Проза:
историческая проза
5.00
рейтинг книги
Гурко. Под стягом Российской империи

Смертельные враги

Зевако Мишель
5. История рода Пардальянов
Приключения:
исторические приключения
5.00
рейтинг книги
Смертельные враги

Месть изгоя. Книга 3. Вариант О.Рыбаченко

Большаков Алексей Владимирович
5.00
рейтинг книги
Месть изгоя. Книга 3. Вариант О.Рыбаченко

Красавица Альмиу

Мак Иван
23. Легенды Вселенной
Фантастика:
боевая фантастика
5.00
рейтинг книги
Красавица Альмиу

Любовь-морковь и третий лишний

Донцова Дарья
17. Евлампия Романова. Следствие ведет дилетант
Детективы:
иронические детективы
7.50
рейтинг книги
Любовь-морковь и третий лишний

Ловчий смерти

Леженда Валентин
Фантастика:
фэнтези
5.00
рейтинг книги
Ловчий смерти

Инквизитор и нимфа

Зонис Юлия
Фантастика:
фэнтези
6.00
рейтинг книги
Инквизитор и нимфа

Лейтенант. Назад в СССР. Книга 8. Часть 1

Гаусс Максим
8. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Назад в СССР. Книга 8. Часть 1

Русские инородные сказки - 6

Фрай Макс
6. Русские инородные сказки
Фантастика:
фэнтези
6.25
рейтинг книги
Русские инородные сказки - 6