我们 已经讨论过 如何 正确地 编写 setName: 和 setEmail:这两项措施,并且 也应该理解了 其中的重要原理。我们 回到 上一篇博文中的程序,让 系统 自动 生成 setName: 和 setEmail:这两项措施。下面 是 修改过后的AddressCard.h文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface AddressCard : NSObject { NSString *name; NSString *email; } @property (copy,nonatomic) NSString *name,*email; -(void)print; @end |
其中的
|
@property(copy,nonatomic)NSString*name,*email;
|
这行语句 将 AddressCard这类物件的两项属性name 和 email 标记出来。同时 这行语句 又 列举出 name 和 email这两项属性的两个特性,它们 分别 是 copy 和 nonatomic。
其中 copy这个特性 表明 在setName: 和 setEmail:这两项措施当中 将 name 和 email两个个体变量 做个 备份,就像 在上一篇博文里面那样。默认的特性 是 不做备份,而 简单的 将 参数中的物件的地址 存储 在name 和 email这两个变量中,这 在上一篇博文中 也示范过。
而 nonatomic这个特性 表明 name 或 email这两项措施 在将 变量name 和 email的值 读取出来之前,不应该保持 或者 自动释放 变量name 和 email。这一点 在今后 会 更加详细地 讲述。
接着 在AddressCard.m这个文件当中 需要用 @synthesize这个命令 来生成 setName;,name 和 setEmail:,email两对措施。下面 是 经过修改了地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 | #import "AddressCard.h" @implementation AddressCard @synthesize name,email; -(void)print { NSLog(@"================================="); NSLog(@"| |"); NSLog(@"|%-31s|",[name UTF8String]); NSLog(@"|%-31s|",[email UTF8String]); NSLog(@"| |"); NSLog(@"| |"); NSLog(@"| 0 0 |"); NSLog(@"================================="); } -(void)dealloc { [name release]; [email release]; [super dealloc]; } @end |
大家 可以 自己 去验证一下,自动生成的setName:,name 和 setEmail:,email这两对措施 是否能 正常 工作。
接下来 我们 要为 AddressCard这类物件 编写 一项新的措施。大家 很可能 希望 同时 设定 某个AddressCard类型物件的姓名 和 邮箱地址。于是 新编写的措施 就是 这样:
|
-(void)setName:(NSString*)theNameandEmail:(NSString*)theEmail
{
self.name=theName;
self.email=theEmail;
}
|
在setName:andEmail:这项措施中 我们 依靠 系统自动生成的setName: 和 setEmail:这两项措施 正确地 设定了 实施对象所包含的name 和 email两个个体变量。
下面的程序 测试了 setName:andEmail:这项新的措施 是否能 正常 工作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #import <Foundation/NSAutoreleasePool.h> #import "AddressCard.h" int main(int argc,const char *argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; AddressCard *myAddressCard=[[AddressCard alloc] init]; [myAddressCard setName:@"Zijin Zhang" andEmail:@"540596744@qq.com"]; [myAddressCard print]; [myAddressCard release]; [pool drain]; return 0; } |
运行后的结果 是 这样的:
|
2012-04-18 17:33:57.218 Sample[5189:707] =================================
2012-04-18 17:33:57.219 Sample[5189:707] | |
2012-04-18 17:33:57.220 Sample[5189:707] |Zijin Zhang |
2012-04-18 17:33:57.220 Sample[5189:707] |540596744@qq.com |
2012-04-18 17:33:57.221 Sample[5189:707] | |
2012-04-18 17:33:57.221 Sample[5189:707] | |
2012-04-18 17:33:57.222 Sample[5189:707] | 0 0 |
2012-04-18 17:33:57.222 Sample[5189:707] =================================
|