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

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

Жанры

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

Этот метод тестируется в программе 15.9. #import <Foundation/Foundation.h> #import "AddressCard.h" int main {int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *aName = @ "Julia Kochan"; NSString *aEmail = @"jewls337@axlc.com"; NSString *bName = @"Tony lannino"; NSString *bEmail = @"tony.iannino@techfilness.com"; AddressCard *card1 = [[AddressCard alloc] init]; AddressCard *card2 = [[AddressCard alloc] init]; [cardl setName: aName andEmail: aEmail]; [card2 setName: bName andEmail: bEmail]; [cardl print]; [card2 print]; [cardl release]; [card2 release]; [pool drain]; return 0; }

Вывод программы 15.9 ======================================== | | | Julia Kochan | | jewls337@axlc.com | | | | | | | | O O | ======================================== ======================================== | | | Tony lannino | | tony.iannino@techfilness.com | | | | | | | | O O | ========================================

Класс AddressCard, казалось бы, действует правильно. Но как быть, если нужно работать с большим числом адресных карточек (объектов AddressCard)? Видимо, имеет смысл собрать их вместе. Именно это мы и сделаем, определив новый класс AddressBook (Адресная книга). В классе AddressBook будет храниться имя адресной книги и набор адресных карточек в объекте-массиве. Начнем со средств создания новой адресной книги, добавления в нее новых адресных карточек, определения числа содержащихся в ней записей и вывода списка ее содержимого. Затем нам потребуются средства поиска в этой адресной книге, удаления записей, редактирования существующих записей, их сортировки и создания копии содержимого.

Начнем с простого файла секции interface (программа 15.10). #import <Foundation/NSArray.h> #import "AddressCard.h" @interface AddressBook: NSObject { NSString *bookName; NSMutableArray *book; } -(id) initWithName: (NSString *) name; -(void) addCard: (AddressCard*) theCard; -(int) entries; -(void) list; -(void) dealloc; @end

Метод initWithName: создает начальный массив для адресных карточек и со-храняет имя адресной книги. Метод addCard: добавляет отдельную адресную карточку (AddressCard) в книгу. Метод entries возвращает число адресных карточек в книге, а метод list выводит краткий список всего содержимого книги. В программе 15.10 показан файл секции implementation для класса AddressBook. #import "AddressBook.h" @Implementation AddressBook; // задание имени адресной книги и пустой книги -(id) initWithName: (NSString *) name { self = [super init]; if (self) { bookName = [[NSString alloc] initWithString: name]; book = [[NSMutableArray alloc] init]; } return self; } -(void) addCard: (AddressCard *) theCard { [book addObject: 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 (@"============================================="); } -(void) dealloc { [bookName release]; [book release]; [super dealloc]; } @end

Метод initWithName: сначала вызывает метод init для суперкласса, чтобы вы-полнить его инициализацию. Затем он создает строковый объект (с использо-ванием alloc, то есть он владеет им) и присваивает ему имя адресной книги, пе-реданное как name. После этого выполняется выделение памяти и инициализация пустого мутабельного массива, который сохраняется в переменной экземпляра book.

Как мы определили, метод initWithName: возвращает обьект типа id, а не объект AddressBook. Если класс Address Book имеет подкласс, то аргумент для initWithName: не является объектом AddressBook; его тип определяется подклассом. Поэтому мы определяем тип возвращаемого объекта как обобщенный тип объекта.

Отметим также, что в initWithName: мы получаем владение переменными эк-земпляра bookName и book с помощью alloc. Например, если создать массив для book с помощью метода NSMutableArray array, как в book = [NSMutableArray array];

вы все же не будете владельцем массива book; им будет владеть NSMutabbArray. Таким образом, вы не сможете освободить его память, когда будете освобождать память для объекта AddressBook.

Метод addCard: принимает в качестве аргумента объект AddessCard и добавляет его в адресную книгу.

Метод count выдает число элементов массива. Метод entries использует эго значение, возвращая число адресных карточек, хранящихся в адресной книге. Быстрое перечисление

В цикле for метода list показана новая конструкция. for ( AddressCard *theCard in book) NSLog {@"%-20s %-32s", [theCard.name UTFBString], [theCard.email UTF8String]);

Здесь применяется метод под названием быстрое перечисление (fast enumeration), который осуществляет перебор всех элемен шв массива book. У него простой синтаксис: определяется переменная, которая содержит по очереди каждый элемент массива (AddressCard *theCard). После ключевого слова in указывается имя массива. При выполнении цикла for указанной переменной сначала присваивается первый элемент массива, а затем выполняется тело цикла. На следующем шаге цикла этой переменной присваивается агорой элемент мас-сива и выполняется тело цикла. Цикл выполняется до тех пор, пока переменной не будут присвоены все элементы массива (каждый раз с выполнением тела цикла).

Если бы мы определили ранее theCard как объект AddressCard, то цикл for выг-лядел бы проще: for (theCard in book)

Ниже приводится тестовая программа 15.10 для проверки нового класса AddressBook. #import "AddressBook.h" #import <Foundation/NSAutoreleasePool.h> int main {int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePooi alloc] init]; NSString *aName = @"Julia Kochan"; NSString *aEmail = @"jewls337@axlc.com"; NSString *bName = @'Tony lannino"; NSString *bEmail = @"tony. iannino@techfitness.com''; NSString *cName = @''Stephen Kochan"; NSString *cEmail = @"steve@kochan-wood.com"; NSString *dName = @"Jamie Baker"; NSString *dEmail = @"jbaker@kochan-wood.com"; AddressCard *card1 = [[AddressCard alloc] init]; AddressCard *card2 = [[AddressCard alloc] init]; AddressCard *card3 = [[AddressCard alloc] init]; AddressCard *card4 = [[AddressCard alloc] init]; AddressBook *myBook = [AddressBook alloc]; // Сначала задаем четыре адресные карточки [card1 setName: aName andEmail: aEmail]; [card2 setName: bName andEmail: bEmail]; [card3 setName: cNarne andEmail: cEmail]; [card4 setName: dName andEmail: dEmail]; // Теперь инициализируем адресную книгу myBook = [myBook initWithName: @"Linda’s Address Book"]; NSLog (@"Entries in address book after creation: %i", [myBook entries]); // Добавляем несколько карточек в адресную книгу [myBook addCard: cardl]; [myBook addCard: card2]; [myBook addCard: card3]; [myBook addCard: card4]; NSLog(@"Entries in address book after adding cards: %i", [myBook entries]); // Теперь вывод всех записей адресной книги [myBook list]; [cardl release]; [card2 release]; [card3 release]; [card4 release]; [myBook release]; [pool drain]; return 0; }

Вывод программы 15.10 Entries in address book after creation: 0 (Записей в адресной книге после создания) Entries in address book after adding cards: 4 (Записей в адресной книге после добавления карточек) ======== Contents of: Linda’s Address Book == Julia Kochan jewls337@axlc.com Tony lannino tony.iannino@techfitness.com Stephen Kochan steve@kochan-wood.com Jamie Baker jbaker@kochan-wood.com

В программе задаются четыре адресные карточки и создается новая адресная книга с именем Linda’s Address Book. Эти четыре карточки добавляются затем в адресную книгу с помощью метода addCard:, после чего метод list выводит и проверяет содержимое адресной книги. Поиск в адресной книге

Если адресная книга большая, то вы не будете выводить все ее содержимое каж-дый раз, чтобы найти конкретного человека. Добавим для этого соответствующий метод. Назовем этот метод lookup: (поиск); он будет принимать в качестве аргумента имя, которое нужно найти. Этот метод будет выполнять поиск соот-ветствия в адресной книге (без учета регистра букв) и возвращать соответству-ющую запись, если она найдена. Если указанного имени нет в адресной книге, возвращается nil.

Ниже приводится метод lookup:. // поиск адресной карточки по имени - требуется точное совпадение -(AddressCard *) lookup: (NSString *) theName { for (AddressCard *nextCard in book ) if ([[nextCard name] caselnsensitiveCompare: theName] == NSOrderedSame ) return nextCard; return nil; }

Поместим объявление этого метода в файл секции interface, а его определение — в файл секции implementation и напишем тестовую программу для опробования этого метода. Это программа 15.11 и ее вывод. #import "AddressBook.h" #import <Foundation/NSAutoreleasePool.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *aName = @ "Julia Kochan"; NSString *aEmail = @"jewls337@axlc.com"; NSString *bName = @"Tony lannino"; NSString *bEmail = @"tony.iannino@techfitness.com"; NSString *cName = @"Stephen Kochan"; NSString *cEmail = @"steve@kochan-wood.com"; NSString *dName = Jamie Baker"; NSString *dEmail = @"jbaker@kochan-wood.com"; AddressCard *card1 = [[AddressCard alloc] init]; AddressCard *card2 = [[AddressCard alloc] init]; AddressCard *card3 = [[AddressCard alloc] init]; AddressCard *card4 = [[AddressCard alloc] init]; AddressBook *myBook = [AddressBook alloc]; AddressCard *myCard; // Сначала задаем четыре адресные карточки [card 1 setName: aName andEmail: aEmail]; [card2 setName: bName andEmail: bEmail]; [card3 setName: cName andEmail: cEmail]; [card4 setName: dName andEmail: dEmail]; myBook = [myBook initWithName: @"Linda’s Address Book"]; // Добавляем несколько карточек в адресную книгу [myBook addCard: card 1]; [myBook addCard: card2]; [myBook addCard: card3]; [myBook addCard: card4]; // ПОИСК человека по имени NSLog (@"Lookup: Stephen Kochan"); myCard = [myBook lookup: @"stephen kochan"]; if (myCard != nil) [myCard print]; else NSLog (@"Not found!"); // Еще одна попытка поиска NSLog (@"Lookup: Haibo Zhang"); myCard = [myBook lookup: @"Haibo Zhang"]; if (myCard != nil) [myCard print]; else NSLog (@"Not found!"); [cardl release]; [card2 release]; [card3 release]; [card4 release]; [myBook release]; [pool drain]; return 0; }

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

Бестужев. Служба Государевой Безопасности

Измайлов Сергей
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род

Гранит науки. Том 3

Зот Бакалавр
3. Героями не становятся, ими умирают
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Гранит науки. Том 3

Варяг

Мазин Александр Владимирович
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Варяг

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Сипстрасси

Геммел Дэвид
Фантастика:
фэнтези
5.00
рейтинг книги
Сипстрасси

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Изгой Проклятого Клана. Том 5

Пламенев Владимир
5. Изгой
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 5

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Звездная Кровь. Изгой IV

Елисеев Алексей Станиславович
4. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой IV