實(shí)現(xiàn)拷貝,需要遵守以下兩個(gè)協(xié)議
拷貝返回對(duì)象的種類(lèi)
拷貝的種類(lèi)
注意
copy
retain
非容器對(duì)象(如NSString
))
對(duì)于不可變對(duì)象
規(guī)則
示例
- (void)imutableInstanceCopy{ NSString *string = @"Welcome to Xcode"; //copy,淺拷貝 NSString *stringCopy = [string copy]; //mutableCopy,返回的對(duì)象可變 NSMutableString *stringMutableCopy = [string mutableCopy]; [stringMutableCopy appendString:@"!"]; //string與stringCopy的內(nèi)存地址相同 NSLog(@"string: %p", string); NSLog(@"strongCopy: %p", stringCopy); //string與stringMutableCopy的內(nèi)存地址不同,分配了新的內(nèi)存 NSLog(@"stringMCopy:%p", stringMutableCopy);}
對(duì)于可變對(duì)象
規(guī)則
示例
- (void)mutableInstanceCopy{ NSMutableString *mutableString = [NSMutableString stringWithString: @"Welcome to Xcode"]; //深拷貝,返回對(duì)象不可變 NSString *stringCopy = [mutableString copy]; NSMutableString *mutableStringCopy = [mutableString copy]; //運(yùn)行時(shí),此句會(huì)報(bào)錯(cuò),錯(cuò)誤信息“Attempt to mutate immutable object with appendString:” [mutableStringCopy appendString:@"~~~"]; //深拷貝,返回對(duì)象可變 NSMutableString *stringMutableCopy = [mutableString mutableCopy]; [stringMutableCopy appendString:@"!"]; //三者與mutableString的內(nèi)存地址都不同 NSLog(@"mutableString: %p", mutableString); NSLog(@"string: %p", stringCopy); NSLog(@"mutableStringCopy: %p", mutableStringCopy); NSLog(@"stringMutbleCopy:%p", stringMutableCopy);}
容器對(duì)象(NSArray
)
注意
示例
- (void)containerInstanceShallowCopy{ NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil]; //淺拷貝 NSArray *arrayCopy = [array copy]; //深拷貝 NSMutableArray *arrayMutableCopy = [array mutableCopy]; NSLog(@"array: %p", array); NSLog(@"arrayCopy: %p", arrayCopy); NSLog(@"arrayMutableCopy: %p", arrayMutableCopy); //容器內(nèi)的對(duì)象是淺拷貝,即它們?cè)趦?nèi)存中只有一份 NSMutableString *testString = [array objectAtIndex:0]; [testString appendString:@" you"]; //三個(gè)數(shù)組的內(nèi)容同時(shí)改變 NSLog(@"array[0]: %@", array[0]); NSLog(@"arrayCopy[0]: %@", arrayCopy[0]); NSLog(@"arrayMutableCopy[0]: %@", arrayMutableCopy[0]);}
實(shí)現(xiàn)真正意義上的深復(fù)制
- (void)containerInstanceDeepCopy{ NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil]; //數(shù)組內(nèi)對(duì)象是指針復(fù)制 NSArray *deepCopyArray = [[NSArray alloc] initWithArray:array]; //真正以上的深復(fù)制,數(shù)組內(nèi)對(duì)象是對(duì)象復(fù)制 NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]]; NSLog(@"array: %p", array); NSLog(@"deepCopyArray: %p", deepCopyArray); NSLog(@"trueDeepCopyArray: %p", trueDeepCopyArray); //改變array的第一個(gè)元素 [[array objectAtIndex:0] appendString:@" you"]; //只影響deepCopyArray數(shù)組的第一個(gè)元素 NSLog(@"array[0]: %@", array[0]); NSLog(@"arrayCopy[0]: %@", deepCopyArray[0]); //不影響trueDeepCopyArray數(shù)組的第一個(gè)元素,是真正意義上的深拷貝 NSLog(@"arrayMutableCopy[0]: %@", trueDeepCopyArray[0]);}
自定義對(duì)象
在定義對(duì)象要實(shí)現(xiàn)拷貝,需要遵守NSCoping與NSMutableCoping協(xié)議,并實(shí)現(xiàn)以下方法
示例(自定對(duì)象Person的拷貝)
遵守協(xié)議,設(shè)置成員屬性
@interface Person : NSObject <NSCopying, NSMutableCopying>/**姓名*/@PRoperty (nonatomic, copy) NSMutableString *name;/**地址*/@property (nonatomic, copy) NSString *address;/**年齡*/@property (nonatomic, assign) NSInteger age;@end
重寫(xiě)初始化方法
- (instancetype)init{ if (self = [super init]) { self.name = [[NSMutableString alloc] initWithString:@"XiaoYaowang"]; self.address = @"世俗孤島"; self.age = 3; } return self;}
實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone
- (id)copyWithZone:(NSZone *)zone{ Person *p = [[[self class] allocWithZone:zone] init]; p.name = [self.name copy]; p.address = [self.address copy]; p.age = self.age; return p;}
實(shí)現(xiàn)- (id)mutableCopyWithZone:(NSZone *)zone
- (id)mutableCopyWithZone:(NSZone *)zone{ Person *p = [[[self class] allocWithZone:zone] init]; //注意,此處是mutableCopy方法 p.name = [self.name mutableCopy]; p.address = [self.address copy]; p.age = self.age; return p;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注