該協議中有個方法: 想讓本身的類支持拷貝操做(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
若是你所寫的對象須要深拷貝,那麼可考慮新增一個專門執行深拷貝的方法