我们创建的AddressCard这类物件 已经能够 正常 工作了。万一 我 想要创建 许多的地址卡片呢?那么 我们 就需要将 这些地址卡片 搜集起来。于是 我们 就需要创建 AddressBook,也就是 地址簿,这类物件 来代表 搜集起来的卡片。每个AddressBook类型的物件 都会包含 一个可修改的数组物件
用来存储 各张地址卡片。我们创建的AddressBook这类物件 要能够添加 新的卡片,计算 卡片的数量,列举出 各张卡片的内容,最后 还要能够搜索 地址簿中的内容,删除 卡片,编辑 卡片,整理 卡片等等等等。
下面 是 AddressBook这类物件的接口文件AddressBook.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #import <Foundation/NSArray.h> #import "AddressCard.h" @interface AddressBook : NSObject { NSString *bookName; NSMutableArray *book; } -(id)initWithName:(NSString *)name; -(void)addCard:(AddressCard *)card; -(int)entries; -(void)list; -(void)dealloc; @end |
其中 initWithName:这项措施 用来创建 存储卡片的数组物件 同时 设定 地址簿的名称。addCard:这项措施 用来将 卡片 添加 到地址簿当中。entries这项措施 用来计算 地址簿中 地址卡片的数量。list这项措施 用来将 地址簿中的卡片 简略地 显示出来。
下面 是 AddressBook这类物件的实施文件AddressBook.m,这个文件 描述了 适用于AddressBook这类物件的各项措施 是如何 实施的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#import "AddressBook.h"
@implementationAddressBook
-(id)initWithName:(NSString*)name
{
self=[superinit];
if(self!=nil)
{
bookName=[[NSStringalloc]initWithString:name];
book=[[NSMutableArrayalloc]init];
}
returnself;
}
-(void)addCard:(AddressCard*)card
{
[bookaddObject:card];
}
-(int)entries
{
return[bookcount];
}
-(void)list
{
NSLog(@"========%@的内容========",bookName);
for(AddressCard*cardinbook)
{
NSLog(@"%-20s
%-32s",[card.nameUTF8String],[card.emailUTF8String]);
}
NSLog(@"=========================================");
}
-(void)dealloc
{
[bookNamerelease];
[bookrelease];
[superdealloc];
}
@end
|
在initWithName:这项措施当中
这行语句中的self 和 super两个关键字 都是指 initWithName:这项措施的实施对象。但是
是对 initWithName:这项措施的实施对象 采取 适用于NSObject这类物件的init这项措施,对 其 进行初始化,因为 AddressBook这类物件 包含 在NSObject这类物件当中。
接着
这行语句 会判断 initWithName:这项措施的实施对象 是否为 空,如果 不是,就会执行 接下来的语句。
|
bookName=[[NSStringalloc]initWithString:name];
|
这行语句 用 字符串name的内容 创建了 一个新的字符串 并且 存储 在bookName当中。其中 参数的内容 就存储 在字符串name当中,所以 这行语句的作用 就是 将 地址簿的名称 设定成 参数的内容。
| book=[[NSMutableArray alloc] init]; |
这行语句 创建了 一个NSMutableArray类型的物件。
在设定 地址簿名称bookName这个物件 和 创建 数组物件book时,都用到了 alloc这个消息 来分配新的内存地址。这样的话 bookName 和 book这两个物件的地址 都存储 在AddressBook物件中,也就是 说 AddressBook物件 掌握着 bookName 和 book这两个物件的所有权。当你 将AddressBook类型的物件 从内存中 清理出去时 你 就可以同时将 bookName 和 book着这两个物件 从内存中 清理出去。
在addCard:这项措施当中,我 对 其实施对象所包含的数组物件book 采取了 addObject:这项措施。addObject:这项措施 会将 其参数,也就是 这里的地址卡片,添加 到其实施对象,也就是 数组物件book,当中。
在entries这项措施当中,我 对 其实施对象所包含的数组物件book 采取了 count这项措施。count这项措施 会计算出 其实施对象所包含的元素数量。
在list这项措施当中,使用了 一个你可能从来没有见过的结构:
|
for(AddressCard*cardinbook)
{
NSLog(@"%-20s
%-32s",[card.nameUTF8String],[card.emailUTF8String]);
}
|
这个技巧 被称为 快速枚举。这里 利用 快速枚举 依次 读取 数组物件book中的物件。每次读取出来的物件 都会被存储 在AddressCard *类型的变量card中。每当读取完 book中的一个物件,循环体中的语句
| NSLog(@"%-20s %-32s",[card.name UTF8String],[card.email UTF8String]); |
就会执行一次,将 当前读取出来的物件的内容 显示出来。
我们 用 下面的程序 来测试 AddressBook这类物件 是否能正常工作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#import <Foundation/NSAutoreleasePool.h>
#import "AddressBook.h"
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
AddressCard*cardOne=[[AddressCardalloc]init];
AddressCard*cardTwo=[[AddressCardalloc]init];
AddressCard*cardThree=[[AddressCardalloc]init];
AddressCard*cardFour=[[AddressCardalloc]init];
[cardOnesetName:@"Julia
Kochan"andEmail:@"jewls337@axlc.com"];
[cardTwosetName:@"Tony
Iannino"andEmail:@"tony.iannino@techfitness.com"];
[cardThreesetName:@"Jamie
Baker"andEmail:@"jbaker@kochan-wood.com"];
[cardFoursetName:@"Zijin
Zhang"andEmail:@"540596744@qq.com"];
AddressBook*myBook=[[AddressBookalloc]initWithName:@"Zijin's
Address Book"];
NSLog(@"添加卡片前地址簿中的卡片数量:%i",[myBookentries]);
[myBookaddCard:cardOne];
[myBookaddCard:cardTwo];
[myBookaddCard:cardThree];
[myBookaddCard:cardFour];
NSLog(@"添加卡片后地址簿中的卡片数量:%i",[myBookentries]);
[myBooklist];
[cardOnerelease];
[cardTworelease];
[cardThreerelease];
[cardFourrelease];
[myBookrelease];
[pooldrain];
return0;
}
|
运行 这个程序过后,可以得到 这样的结果:
|
2012-04-23 11:55:48.342 Sample[4292:707] 添加卡片前地址簿中的卡片数量:0
2012-04-23 11:55:48.344 Sample[4292:707] 添加卡片后地址簿中的卡片数量:4
2012-04-23 11:55:48.351 Sample[4292:707] ========Zijin's Address Book的内容========
2012-04-23 11:55:48.352 Sample[4292:707] Julia Kochan jewls337@axlc.com
2012-04-23 11:55:48.352 Sample[4292:707] Tony Iannino tony.iannino@techfitness.com
2012-04-23 11:55:48.353 Sample[4292:707] Jamie Baker jbaker@kochan-wood.com
2012-04-23 11:55:48.353 Sample[4292:707] Zijin Zhang 540596744@qq.com
2012-04-23 11:55:48.354 Sample[4292:707] =========================================
|
这个程序 先 创建了 四个AddressCard物件,并且 设定了 每个物件中的姓名 和 邮箱地址。然后 创建了 一个AddressBook物件 作为 地址簿。接着 对 这个AddressBook物件 采取了 addCard:这项措施,将 各张地址卡片 添加 到地址簿当中。最后 对 这个AddressBook物件 采取了 list这项措施,从而 将 地址簿中的内容 显示出来。