标签:
代码:
@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; }
标签:
原文地址:http://www.cnblogs.com/loftyspirit/p/4477170.html