//
// main.m
// CH15-Practice2 AddressBook
//
// Created by jason on 2011/4/30.
// Copyright 2011 __MyCompanyName__. All rights reserved.
#import
#import
#import
#import
@interface AddressCard : NSObject {
NSString *name;
NSString *email;
}
//以下的兩個屬性(attribute)
// Copy : 表示setter中複製一個實體變數 (如 ch15-18中預設為不要複製,這裡是先改變屬性為assign)
// Nonatomic :表示getter在回傳值前不可保留(retain)或自動釋放變數(autorelease )實體變數
@property (copy, nonatomic) NSString *name, *email;
-(void) setName:(NSString *) name andEmail:(NSString *) email;
-(void) print;
-(NSComparisonResult) compareNames: (id) element;
@end
@implementation AddressCard
@synthesize name,email;
-(void) setName:(NSString *) theName andEmail:(NSString *) theEmail{
name=theName;
email=theEmail;
}
-(void) print{
NSLog(@"===============================");
NSLog(@"== ==");
NSLog(@"== %-24s==",[name UTF8String]);
NSLog(@"== %-24s==",[email UTF8String]);
NSLog(@"== ==");
NSLog(@"== ==");
NSLog(@"== ==");
NSLog(@"=======O================O======");
NSLog(@"=======o================o======");
}
//Compare the two names from the specified address cards
-(NSComparisonResult) compareNames: (id) element{
return [name compare: [element name]];
}
@end
@interface AddressBook : NSObject {
NSString *bookName;
NSMutableArray *book;
NSMutableArray *bookMatches;
}
-(id) initWithName: (NSString *) name; // 設定一個陣列以儲存名片與通訊錄名稱
-(void) addcard: (AddressCard *) theCard; // 將AddressCard加入通訊錄
-(void) removeCard:(AddressCard *) theCard;// 刪除theCard
-(void) sort; //排序
-(int) entries; //回傳通訊錄中有多少張名片
-(void) list; //列出名片內容
-(NSMutableArray *) lookup: (NSString *) theName;
-(void) dealloc;
@end
@implementation AddressBook;
// set up the AddressBook's name and an empty book
//我們將initWithName 的回傳值設為id而不是AddressBook,是因為若AddressBook是子類別的話
//傳給initWith的參數就不應該是AddressBook而是子類別型態
-(id) initWithName: (NSString *) name{
self = [super init];//呼叫父類別方法init來初始化
//接著建立空字串
if (self){
bookName=[[NSString alloc] initWithString:name];
book=[[NSMutableArray alloc]init];
//若你使用book= [NSMutbleArray array];來建立book的話,你不是book的擁有者,所以之後你可能沒辦法釋放記憶體
}
return self;
}
-(void) addcard: (AddressCard *) theCard{
[book addObject:theCard];//以AddressCard為物件做參數並將他加入通訊錄
}
//使用NSSArray removeObjectIdenticalTo: 的方法,來移除參數為theCard的資訊內容
//這會移除相同參數名稱的資料,但有可能有兩個位在不同位址的兩張名片(如:複製過的名片)
//不過這前提是要有可以儲存相同物件
-(void) removeCard:(AddressCard *) theCard{
[book removeObjectIdenticalTo:theCard];
}
-(void) sort{
[book sortUsingSelector:@selector(compareNames:)];
// @selector 表示建立一個型態為SEL的selector 參數為一指定的方法名稱
// 此方法名為 sortUsingSelector:
//這個方法(sortUsingSelector)是用來比較陣列中的兩筆資料
//當需要比較的時候,會呼叫一個指定的方法,這裡就是compareNames傳送訊息給陣列中的第一個元素以何其參數做比較
//回傳值為 NSComparisonResult ( NSOrderedAscending ; NSOrderedSame ; NSOrderedDescending)
}
-(int) entries{
return [book count]; //count的方法式計算陣列個數
}
-(void) list{
NSLog(@"=========Content of: %@ ===========", bookName);
//快速列舉,將book陣列的每個元素順序取出
for( AddressCard *theCard in book)
//首先定義一個可以得到陣列每個元素的參數(AddressCard *theCard)
//然後加上 "in" 最後是陣列名稱( book )
//然後執行迴圈主體
NSLog(@"%-20s %-32s",[theCard.name UTF8String],[theCard.email UTF8String]);
NSLog(@"=======================================================");
}
// lookup address casrd by name - assume an exact match
-(NSMutableArray *) lookup: (NSString *) theName
{
[bookMatches release]; // release memory for multiply searches
bookMatches = [[NSMutableArray alloc]init];
AddressCard *nextCard;
for (nextCard in book) // ("varaible" "in" "name of array")
{
NSRange test = [[nextCard name] rangeOfString: theName options: NSCaseInsensitiveSearch];
if (test.length)
[bookMatches addObject:nextCard];
}
if ([bookMatches count])
return bookMatches;
return nil;
}
-(void) dealloc{
[bookName release];
[book release];
[bookMatches release];
[super dealloc];
}
@end
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
NSString *aName=@"Jason Huang";
NSString *aEmail=@"jason.huang@hotmail.com";
NSString *bName=@"Sharon Kang";
NSString *bEmail=@"sharon.kang@hotmail.com";
NSString *cName=@"Julia Lin";
NSString *cEmail=@"julia.lin@hotmail.com";
NSString *dName=@"Irene Huang";
NSString *dEmail=@"irene.huang@hotmail.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;
NSMutableArray *mySearch;
//First set up four address cards
[card1 setName: aName andEmail: aEmail];
[card2 setName: bName andEmail: bEmail];
[card3 setName: cName andEmail: cEmail];
[card4 setName: dName andEmail: dEmail];
//Now initialize the address book
myBook =[myBook initWithName:@"Joe's address book"];
NSLog(@"Entries in address book after creation: %i",[myBook entries]);
//Add some cards to the address book
[myBook addcard:card1];
[myBook addcard:card2];
[myBook addcard:card3];
[myBook addcard:card4];
NSLog(@"Entries in address book after adding cards: %i",[myBook entries]);
//List all the entries in the book now
[myBook list];
NSLog(@"Look up someone's card by name: Huang");
mySearch = [myBook lookup:@"Huang"];
if([mySearch count])
for(myCard in mySearch)
[myCard print];
else
NSLog(@"Not found!");
[card1 release];
[card2 release];
[card3 release];
[card4 release];
[myBook release];
[pool drain];
return 0;
}