在这篇博文当中,我们 要 通过创建 地址簿 将之前学到的东西 结合起来。一本地址簿 会包含 若干地址卡。为了方便起见 我们的地址卡 将 只 包含 姓名 和 邮箱地址。我们 可以将 这个概念 扩展 到其他信息上 比如,地址、电话号码等,大家 可以 自己 尝试。
另外 Mac OS X 提供了 整套的地址簿框架 并且 拥有 极其 强大的功能。
首先 我们 要 创建 一类叫AddressCard的物件 来表示 地址卡。我们的地址卡 能够设置 并且 读取 姓名 和 邮箱地址,还要能将 地址卡 显示 在屏幕上。在图形环境中,我们 可以使用 应用程序套件框架(Application Kit Framework) 提供的超赞的语句 来绘制 卡片。但是 这里 我们 还是用 终端界面 来显示 地址卡片。
下面 是 AddressCard这类物件的接口文件AddressCard.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/NSObject.h> #import <Foundation/NSString.h> @interface AddressCard : NSObject { NSString *name; NSString *email; } -(void)setName:(NSString *)theName; -(void)setEmail:(NSString *)theEmail; -(NSString *)name; -(NSString *)email; -(void)print; @end |
还有 AddressCard这类物件的实施文件AddressCard.m
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 "AddressCard.h"
@implementationAddressCard
-(void)setName:(NSString*)theName
{
name=[[NSStringalloc]initWithString:theName];
}
-(void)setEmail:(NSString*)theEmail
{
email=[[NSStringalloc]initWithString:theEmail];
}
-(NSString*)name
{
returnname;
}
-(NSString*)email
{
returnemail;
}
-(void)print
{
NSLog(@"=================================");
NSLog(@"|
|");
NSLog(@"|%-31s|",[nameUTF8String]);
NSLog(@"|%-31s|",[emailUTF8String]);
NSLog(@"|
|");
NSLog(@"|
|");
NSLog(@"| 0
0 |");
NSLog(@"=================================");
}
-(void)dealloc
{
[namerelease];
[emailrelease];
[superdealloc];
}
@end
|
在setName: 和 setEmail:这两项措施当中 我们 本来 可以 直接 将 代表姓名和邮箱地址的参数 存储 在AddressCard物件的个体变量当中,就像 这样:
| -(void)setName:(NSString *)theName { name=theName; } -(void)setEmail:(NSString *)theEmail { email=theEmail; } |
但是 这样的话 姓名 和 邮箱地址这两个物件 就并不属于 AddressCard物件 所有了。
在print这项措施当中 UTF8String这项措施 会将 name 和 email这两个物件 转换成 c语言字符串。格式符”%-31s” 表示 将 姓名 和 邮箱地址 显示 在31个字符的范围内,并且 向左 靠齐。这 纯属 为了美观。
现在 我们 已经有了 AddressCard这类物件,我们 马上 就在具体的程序中 来创建 一个AddressCard类型的物件,也就是 地址卡,并且 为 这个地址卡 设置 姓名 和 邮箱地址,最后 将 整个卡片 显示出来。
下面 就是 主程序文件main.m:
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/NSAutoreleasePool.h>
#import "AddressCard.h"
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
AddressCard*myAddressCard=[[AddressCardalloc]init];
myAddressCard.name=@"Zijin
Zhang";
myAddressCard.email=@"540596744@qq.com";
[myAddressCardprint];
[myAddressCardrelease];
[pooldrain];
return0;
}
|
运行 这个程序后,可以得到 这样的结果:
| 2012-04-16 16:54:08.833 Sample[1151:707] ================================= 2012-04-16 16:54:08.835 Sample[1151:707] | | 2012-04-16 16:54:08.836 Sample[1151:707] |Zijin Zhang | 2012-04-16 16:54:08.836 Sample[1151:707] |540596744@qq.com | 2012-04-16 16:54:08.837 Sample[1151:707] | | 2012-04-16 16:54:08.837 Sample[1151:707] | | 2012-04-16 16:54:08.838 Sample[1151:707] | 0 0 | 2012-04-16 16:54:08.838 Sample[1151:707] ================================= |
在这个程序当中
这行语句 会将 myAddressCard这个地址卡物件所占用的内存 腾空。你 必须意识到 myAddressCard这个物件 包含了 name 和 email这两个物件。刚刚的这行语句 并不能将 name 和 email这两个物件所占用的内存 腾空。于是 我们 必须 重新 编写 dealloc这项措施,因为 release这项措施 会对其实施对象 采取 dealloc这项措施。这 是 重新编写的dealloc措施:
| -(void)dealloc { [name release]; [email release]; [super dealloc]; } |
我们 必须 先 清理 name 和 email这两个物件 再 清理 AddressCard物件本身,因为 一旦 AddressCard物件本身 被清理了,这个物件 就 不再有效,你 也就 无法 找到 这个物件所包含的另外两个物件name 和 email。
如果 有 人 改变 地址卡中的姓名 和 邮箱地址,那么 必须 先 把 原来的姓名 和 邮箱地址所占用的内存 腾空。于是 我们 必须 稍微 修改一下 setName: 和 setEmail:这两项措施,就像 这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
-(void)setName:(NSString*)theName
{
[namerelease];
name=[[NSStringalloc]initWithString:theName];
}
-(void)setEmail:(NSString*)theEmail
{
[emailrelease];
email=[[NSStringalloc]initWithString:theEmail];
}
|