如果让一个自定义类 能用定义copy属性的实例变量就需对该类接收nscopying协议
//外界如果想要让person对象执行copy方法,必须接收NSCopying协议,实现协议里的方法,来定义copy的细节。
//一个类可以接收多个协议,协议与协议之间用逗号隔开。所有的协议写在父类后面的尖括号内部。
@interface Person : NSObject<SayHello, NSCopying>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *gender;
@property (nonatomic, retain) NSMutableArray *mArr;
并且在.m文件中红重写copyWithZone方法
//伪拷贝,相当于没有拷贝,只是让外界的对象执行了一次retain操作。
//- (id)copyWithZone:(NSZone *)zone {
// return [self retain];
//}
//浅拷贝
//拷贝的是地址,对象两个,共用一份内容,改变其中一个对象实例变量的值,另外一个也会访问到改变之后的值。但是一定要注意,字符串如果指向常量区,那么改值相当于重指向,并不会影响另外一个对象的值。
//- (id)copyWithZone:(NSZone *)zone {
// Person *person = [[Person allocWithZone:zone] init];
// person.name = self.name;
// person.gender = self.gender;
// person.mArr = self.mArr;
// return person;
//}
//深拷贝,对象两份,内容两份,改变其中一个的值,另外一个不会发生改变。
//拷贝怎么实现,到底是深拷贝还是浅拷贝,取决于内部代码的实现。
- (id)copyWithZone:(NSZone *)zone {
Person *person = [[Person allocWithZone:zone] init];
person.name = [self.name mutableCopy];
person.gender = [self.gender mutableCopy];
person.mArr = [self.mArr mutableCopy];
return person;
}