一.什么叫對(duì)象Copy
? ? 可能大多開發(fā)者對(duì)于數(shù)組却邓,字典硕糊,字符串的copy都有了解,對(duì)于淺拷貝和深拷貝更是耳熟能詳,但很少聽說對(duì)拷貝腊徙。是的對(duì)象拷貝简十,我們很少用到,因?yàn)榇蠖喽际菍?duì)象賦值昧穿。不過勺远,我在實(shí)際的coding時(shí),還是遇到過幾次需要拷貝對(duì)象的情景时鸵,一上來還真是費(fèi)了不少周折胶逢,所以今天在這里和大家分享下"對(duì)象的拷貝".
二.單個(gè)對(duì)象的Copy
這是一個(gè)類名為Person的model,其中有三個(gè)屬性饰潜,我們就拿name這個(gè)屬性來講解吧初坠。
@interface Person : NSObject
@property (nonatomic,copy) NSString *? name;
@property (nonatomic,assign) NSInteger? age;
@property (nonatomic,assign) BOOL? gender;
@end
這是在Controller,對(duì)Person的一系列操作:
Person * person1 = [[Person? alloc]init];
person1.name = @"王一";
Person * person2 = [[Person alloc]init];
person2 = person1;
Person? * copyPerson = [person1 copy];
copyPerson.name = person1.name;
person1.name = @"張三";
NSLog(@"person1--%@",person1.name);
NSLog(@"person2--%@",person2.name);
NSLog(@"copyPerson--%@",copyPerson.name);
打印結(jié)果:
?22:19:23.748 [4141:95809] person1--張三
22:19:23.748 [4141:95809] person2--張三
22:19:23.749 [4141:95809] copyPerson--王一
看下彭雾,Person2是Person1直接賦值過去的碟刺,當(dāng)person1.name改變時(shí),person2.name的值也改變了薯酝。
而此時(shí)copyPerson是person1通過copy過來的半沽,它里面的name的值就不會(huì)改變,其實(shí)很多時(shí)候我們不就是想要的是這種結(jié)果嘛吴菠。那么者填,當(dāng)直接調(diào)用[person1 ?copy]時(shí),系統(tǒng)會(huì)崩潰的做葵,那么玄機(jī)就在這里:
要遵守NSCopying協(xié)議占哟,并要實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone這個(gè)協(xié)議方法,就可以實(shí)現(xiàn)對(duì)象的Copy.
三.數(shù)組里的對(duì)象的Copy.
? ? ? 有時(shí)我們需要對(duì)一個(gè)數(shù)組進(jìn)行保存,這個(gè)保存數(shù)組里一定是保存的數(shù)組最原始的值榨乎。不管當(dāng)前數(shù)組做了什么操作怎燥,保存數(shù)組一定要保證原始值。
Person * person1 = [[Person? alloc]init];
person1.name = @"王一";
Person * person2 = [[Person alloc]init];
person2.name = @"王二";
NSArray? * array1 = [[NSArray? alloc]initWithObjects:person1,person2, nil];
NSArray? * tempArray1 = [array1? copy];
NSArray? * tempArray2 = [array1 mutableCopy];
NSMutableArray? * tempArray3 = [NSMutableArray array];
for (Person * item in array1) {
Person? * tempPerson = [item copy];
[tempArray3? addObject:tempPerson];
}
Person? *? personW = [array1? objectAtIndex:0];
personW.name = @"張三";
Person? * tempPerson1 = [tempArray1 objectAtIndex:0];
Person? * tempPerson2 = [tempArray2 objectAtIndex:0];
Person? * tempPerson3 = [tempArray3 objectAtIndex:0];
NSLog(@"tempArray1--%@",tempPerson1.name);
NSLog(@"tempArray2--%@",tempPerson2.name);
NSLog(@"tempArray3--%@",tempPerson3.name);
看下打印結(jié)果:
2016-09-17 22:51:18.995 ?tempArray1--張三
2016-09-17 22:51:18.996 ?tempArray2--張三
2016-09-17 22:51:18.996 tempArray3--王一
由上面打印結(jié)果蜜暑,我們看到array淺拷貝铐姚,深拷貝得到的array1和array2都會(huì)隨著array對(duì)象的屬性改變而改變,只有通過copy建立的array3的對(duì)象還是最初array1的值史煎,這就實(shí)現(xiàn)了們保存數(shù)組的目的谦屑。
當(dāng)然驳糯,保存數(shù)組最原始值其實(shí)不止這一種方法篇梭,還有其他方法,由于本文主要講對(duì)象copy酝枢,所以數(shù)組保存我就用對(duì)象copy的方法實(shí)現(xiàn)恬偷。
歡迎討論交流,批評(píng)指正A蹦馈E刍肌!