码迷,mamicode.com
首页 > 其他好文 > 详细

自定义类与NSCopying协议

时间:2015-05-04 21:41:07      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:

代码:

@import Foundation;

/****************************************
 * Person类
 ****************************************/
// 要采用某个协议,需要在类的声明中列出该协议的名称,并用尖括号括起来
// 同时采用多个协议,则在协议的名称之间用逗号分割,如:<NSCopying, NSMutableCopying>
// 可以按任意顺序列出多个协议
@interface Person : NSObject <NSCopying>

// 姓名属性
@property (copy, nonatomic) NSString *name;

@end

@implementation Person

- (id)copyWithZone:(NSZone *)zone {
    // 通过使用self.class,allocWithZone:消息将会被发送给正在接受copy消息的实例所属的类
    // 这个类可能是copyWithZone:消息所在类的子类,通过这种方式可以正确的创建想要的实例
    // 如果不使用self.class,而使用具体的类名,可能导致创建得到的实例无法返回给类型正确的实例指针
    // allocWithZone:方法是一个类方法,其返回新创建的实例
    // zone是NSZone结构体的一个指针,用与标示和管理内存区域
    Person* personCopy = [[self.class allocWithZone:zone] init];
    
    // 复制实例变量或属性
    personCopy.name = self.name;
    
    // 返回实例
    return personCopy;
}

@end

/****************************************
 * GoodPerson类 : Person类
 ****************************************/
@interface GoodPerson : Person

// 年龄属性
@property (assign, nonatomic) NSUInteger age;

@end

@implementation GoodPerson

- (id)copyWithZone:(NSZone *)zone {
    // 由于父类已经实现了copyWithZone:方法,子类只需调用该方法,并完成自己的属性的复制工作即可
    GoodPerson *goodPersonCopy = [super copyWithZone:zone];
    
    // 复制子类实例的变量或属性
    goodPersonCopy.age = self.age;
    
    // 返回实例
    return goodPersonCopy;
}

@end

/****************************************
 * main函数
 ****************************************/
int main(int argc, const char * argv[]) {
    GoodPerson *gp1 = [[GoodPerson alloc] init];
    gp1.name = @"BBB";
    gp1.age = 40;
    
    GoodPerson *gp2 = [gp1 copy];
    gp2.name = @"CCC";
    gp2.age = 50;
    
    NSLog(@"gp1 = %@", gp1);
    NSLog(@"gp2 = %@", gp2);
    
    return 0;
}

 

自定义类与NSCopying协议

标签:

原文地址:http://www.cnblogs.com/loftyspirit/p/4477170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!