自定义类实现<NSCopying>协议_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > 自定义类实现<NSCopying>协议

自定义类实现<NSCopying>协议

 2015/1/24 15:22:30  那年阳光灿烂  程序员俱乐部  我要评论(0)
  • 摘要:目的:自定义一个Person类,实现copy.首先定义一个Person类,由于是自定义类,为了能够支持copy方法,需要实现<NSCopying>协议@interfacePerson:NSObject<NSCopying>@property(nonatomic,retain)NSString*name;@property(nonatomic,retain)NSString*sex;-(void)setName:(NSString*)namesex:(NSString*
  • 标签:实现 协议 自定义

目的:自定义一个 Person 类,实现 copy.

首先定义一个 Person 类,由于是自定义类,为了能够支持 copy 方法,需要实现<NSCopying>协议

@interface Person : NSObject<NSCopying>
@property (nonatomic, retain)NSString * name;
@property (nonatomic, retain)NSString * sex;

- (void)setName:(NSString *)name
            sex:(NSString *)sex;
@end

<NSCopying>协议中有一个 - (class="s1">id)copyWithZone:(NSZone *)zone方法,需要在 Person 的. m 文件中实现它.

@implementation Person

- (id)copyWithZone:(NSZone *)zone
{
    id p = [[[self class] allocWithZone:zone] init];<span style="white-space:pre">    //考虑到 Person 可能会有子类,这里用 id 表示类型
    [p setName:_name sex:_sex];                //设置复制对象的实例变量,否则默认拷贝的对象的实例变量值为空
    return p;
}
- (void)setName:(NSString *)name
            sex:(NSString *)sex
{
    _name = name;
    _sex = sex;
}
@end

在main.m 文件中进行测试

Person * p1 = [[Person alloc] init];                                 //创建 p1 对象
        [p1 setName:@"张三" sex:@""];                              //为 p1 实例变量赋值
        Person * p2 = [p1 copy];                                    //从 p1 拷贝一个新对象 p2
        NSLog(@"p2.name = %@, p2.sex = %@", p2.name, p2.sex);       //打印 p2 的 name 和 sex
        p2.name = @"李四";                                          //更改 p2 的 name
        NSLog(@"p2.name = %@", p2.name);
        NSLog(@"p1.name = %@", p1.name);                            //再次打印 p1 的 name,验证 p1 的 name 是否改变

下面是打印结果:

2015-01-21 21:27:59.466 CopyTest[2053:303] p2.name = 张三, p2.sex =2015-01-21 21:27:59.468 CopyTest[2053:303] p2.name = 李四
2015-01-21 21:27:59.468 CopyTest[2053:303] p1.name = 张三

可以看出,改变 p2 的 name, 并没有影响 p1 的name.

发表评论
用户名: 匿名