iOS OC NSCopying 協議

一  NSCopying 協議

    想讓本身的類支持拷貝操做(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

  • 若是你所寫的對象須要深拷貝,那麼可考慮新增一個專門執行深拷貝的方法

相關文章
相關標籤/搜索