我们创建的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"
@implementation
AddressBook
-
(
id
)
initWithName
:
(
NSString
*
)
name
{
self
=
[
super
init
]
;
if
(
self
!=
nil
)
{
bookName
=
[
[
NSString
alloc
]
initWithString
:
name
]
;
book
=
[
[
NSMutableArray
alloc
]
init
]
;
}
return
self
;
}
-
(
void
)
addCard
:
(
AddressCard
*
)
card
{
[
book
addObject
:
card
]
;
}
-
(
int
)
entries
{
return
[
book
count
]
;
}
-
(
void
)
list
{
NSLog
(
@"========%@的内容========"
,
bookName
)
;
for
(
AddressCard
*card
in
book
)
{
NSLog
(
@"%-20s %-32s"
,
[
card
.
name
UTF8String
]
,
[
card
.
email
UTF8String
]
)
;
}
NSLog
(
@"========================================="
)
;
}
-
(
void
)
dealloc
{
[
bookName
release
]
;
[
book
release
]
;
[
super
dealloc
]
;
}
@end
|
在initWithName:这项措施当中
1
|
self
=
[
super
init
]
;
|
这行语句中的self 和 super两个关键字 都是指 initWithName:这项措施的实施对象。但是
1
|
[
super
init
]
|
是对 initWithName:这项措施的实施对象 采取 适用于NSObject这类物件的init这项措施,对 其 进行初始化,因为 AddressBook这类物件 包含 在NSObject这类物件当中。
接着
1
|
if
(
self
!=
nil
)
|
这行语句 会判断 initWithName:这项措施的实施对象 是否为 空,如果 不是,就会执行 接下来的语句。
1
|
bookName
=
[
[
NSString
alloc
]
initWithString
:
name
]
;
|
这行语句 用 字符串name的内容 创建了 一个新的字符串 并且 存储 在bookName当中。其中 参数的内容 就存储 在字符串name当中,所以 这行语句的作用 就是 将 地址簿的名称 设定成 参数的内容。
1
|
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这项措施当中,使用了 一个你可能从来没有见过的结构:
1
2
3
4
5
6
7
|
for
(
AddressCard
*card
in
book
)
{
NSLog
(
@"%-20s %-32s"
,
[
card
.
name
UTF8String
]
,
[
card
.
email
UTF8String
]
)
;
}
|
这个技巧 被称为 快速枚举。这里 利用 快速枚举 依次 读取 数组物件book中的物件。每次读取出来的物件 都会被存储 在AddressCard *类型的变量card中。每当读取完 book中的一个物件,循环体中的语句
1
|
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"
int
main
(
int
argc
,
const
char
*argv
[
]
)
{
NSAutoreleasePool
*pool
=
[
[
NSAutoreleasePool
alloc
]
init
]
;
AddressCard
*cardOne
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardTwo
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardThree
=
[
[
AddressCard
alloc
]
init
]
;
AddressCard
*cardFour
=
[
[
AddressCard
alloc
]
init
]
;
[
cardOne
setName
:
@"Julia Kochan"
andEmail
:
@"jewls337@axlc.com"
]
;
[
cardTwo
setName
:
@"Tony Iannino"
andEmail
:
@"tony.iannino@techfitness.com"
]
;
[
cardThree
setName
:
@"Jamie Baker"
andEmail
:
@"jbaker@kochan-wood.com"
]
;
[
cardFour
setName
:
@"Zijin Zhang"
andEmail
:
@"540596744@qq.com"
]
;
AddressBook
*myBook
=
[
[
AddressBook
alloc
]
initWithName
:
@"Zijin's Address Book"
]
;
NSLog
(
@"添加卡片前地址簿中的卡片数量:%i"
,
[
myBook
entries
]
)
;
[
myBook
addCard
:
cardOne
]
;
[
myBook
addCard
:
cardTwo
]
;
[
myBook
addCard
:
cardThree
]
;
[
myBook
addCard
:
cardFour
]
;
NSLog
(
@"添加卡片后地址簿中的卡片数量:%i"
,
[
myBook
entries
]
)
;
[
myBook
list
]
;
[
cardOne
release
]
;
[
cardTwo
release
]
;
[
cardThree
release
]
;
[
cardFour
release
]
;
[
myBook
release
]
;
[
pool
drain
]
;
return
0
;
}
|
运行 这个程序过后,可以得到 这样的结果:
1
2
3
4
5
6
7
8
|
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这项措施,从而 将 地址簿中的内容 显示出来。