Вход/Регистрация
Программирование на Objective-C 2.0
вернуться

Кочан Стивен

Шрифт:

Начнем с простого файла секции 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
  • ...
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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