该协议中有个方法: 想让本身的类支持拷贝操做(copy),就须要实现NSCopying协议 ,atom
-(id)copyWithZone:(NSZone *)zone
zone是以前开发程序程序时,会把内存分红不一样的 zone ,而对象会建立在zone 中。如今不用了,每一个程序只有一个区-默认区(default zone),不用考虑zone参数spa
copy方法由NSObject实现,该方法只是以 默认区 为参数来调用 copyWithZone: 咱们老是想覆写copy方法,其实真正须要实现的倒是 copyWithZone: 方法,这是须要注意的地方。若想使某个类支持拷贝功能,声明该类听从NSCopying协议,并实现其中的方法便可。code
类分为可变版本与不可变版本,那么就应该实现NSMutableCopying,若采用此模式,则在可变类中覆盖 copyWithZone 方法时,不要返回可变的拷贝,而应该返回不可变的版本。不管当前实例是否可变,若须要获取可变版本的拷贝,都应该调用mutableCopy方法,若须要不可变的拷贝,则经过copy方法来获取对象
EOCCopying.h
内存
==EOCCopying.h #import <Foundation/Foundation.h> @interface EOCCopying : NSObject<NSCopying> /*name*/ @property (nonatomic, copy ) NSString *name; /*mutable array*/ @property (nonatomic, copy ) NSMutableArray *array; -initWithName:(NSString *)name; //深拷贝 -(id)deepCopy; @end
EOCCopying.m
开发
// // EOCCopying.m // EOC // // #import "EOCCopying.h" @implementation EOCCopying -(id)initWithName:(NSString *)name { self = [super init]; if (self) { _name = name; _array = [NSMutableArray new]; } return self; } -(id)copyWithZone:(NSZone *)zone { EOCCopying *copy = [[[self class] allocWithZone:zone] initWithName:_name]; // copy.array = [_array mutableCopy]; // copy.array = [_array copy]; //深拷贝 copy->_array = [[NSMutableArray alloc]initWithArray:_array copyItems:YES]; return self; } -(id)deepCopy { EOCCopying *copy = [[[self class] alloc] initWithName:_name]; //深拷贝 copy->_array = [[NSMutableArray alloc]initWithArray:_array copyItems:YES]; return self; } @end
main.mit
// // main.m // EOC // // #import <Foundation/Foundation.h> #import "EOCCopying.h" int main(int argc, const char * argv[]) { @autoreleasepool { EOCCopying *obj = [[EOCCopying alloc]initWithName:@"COPY ---"]; EOCCopying *cop = [obj deepCopy]; NSLog(@"obj.name=%@",obj.name); NSLog(@"cop.name=%@",cop.name); [obj.array addObject:@"1"]; NSLog(@"obj.array[0]=%@",obj.array[0]); obj.array[0] = @"一"; NSLog(@"cop.array[0]=%@",cop.array[0]); NSLog(@"obj.array[0]=%@",obj.array[0]); [cop.array addObject:@"2"]; NSLog(@"cop.array[1]=%@",cop.array[1]); NSLog(@"obj.array[1]=%@",obj.array[1]); obj.name = @"xx"; NSLog(@"obj.name=%@",obj.name); NSLog(@"cop.name=%@",cop.name); } return 0; }
若想令本身所写的对象具备拷贝功能,须要实现NSCopying 协议io
若是自定义的对象分为不可变版本与可变版本,那么就要同时是此案NSCopying 与NSMutableCopying协议table
复制对象时需决定采用浅拷贝仍是深拷贝,通常状况下应该尽可能执行浅拷贝class
若是你所写的对象须要深拷贝,那么可考虑新增一个专门执行深拷贝的方法