现在的位置: 首页 > 综合 > 正文

iphone 深拷贝,NSCopying

2013年12月12日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭

直接写代码:

头文件:

Member类,实现了深拷贝。

VIPMember类,是Member的子类,继承了Member的深拷贝协议。但VIP需要实现copyWithZone函数来实现拷贝。

@interface Member : NSObject<NSCopying>{
    NSString *_name;
}
@property(nonatomic, retain)NSString *name;
@end

@interface VIPMember : Member {
    NSString *_vipPhone;
}
@property (nonatomic, retain)NSString *vipPhone;
@end

实现文件:

@implementation Member
@synthesize name=_name;

- (NSString*)description{
    return [NSString stringWithFormat:@"<Member>{name:%@}", self.name];
}

- (void)dealloc{
    [_name release];
}

- (id)copyWithZone:(NSZone *)zone{
    Member * member = [[self class] allocWithZone:zone];
    member.name = _name;
    return member;
}
@end

@implementation VIPMember
@synthesize vipPhone=_vipPhone;

- (NSString*)description{
    NSString * str = [NSString stringWithFormat:@"<VIPMember>{member:%@,vipPhone:%@}",[super description], self.vipPhone];
    return str;
}

- (void)dealloc{
    [_vipPhone release];
    [super dealloc];
}

- (id)copyWithZone:(NSZone *)zone{
    VIPMember * vipMember = [super copyWithZone:zone];
    vipMember.vipPhone = _vipPhone;
    return vipMember;
}
@end

调用的方法:

    VIPMember * member1 = [[VIPMember alloc] init];
    member1.name = @"wang";
    member1.vipPhone = @"13422223333";
    VIPMember * member2 = [member1 copy];
    member2.name = @"zhang";
    member2.vipPhone = @"13200009999";
    NSLog(@"member1:%d, member2:%d", [member1 retainCount], [member2 retainCount]);
    NSLog(@"member1:%@", member1);
    NSLog(@"member2:%@", member2);

输出的日志:

member1:1, member2:1

member1:<VIPMember>{member:<Member>{name:wang},vipPhone:13422223333}

member2:<VIPMember>{member:<Member>{name:zhang},vipPhone:13200009999}

【上篇】
【下篇】

抱歉!评论已关闭.