关于NScopying的问题

如果让一个自定义类 能用定义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;

}

原文地址:https://www.cnblogs.com/naizui/p/5096414.html