我为我自定义的类,实现NSCopying协议,实现了深拷贝。
但是,我想对NSArray实现深拷贝!也就是说,我想把 深拷贝和浅拷贝的理解(一)-Object-C
中的NSArray实现深拷贝!
难题来了,难道我要重写NSArray类,让其实现NSCopying协议嘛?!
也许,还有更好的办法吧!
当我学会了 归档(archive)文件(二)
用NSData进行归档后,
我发现,可以用NSData提供的内存缓冲区,为NSArray实现深拷贝!
直接贴代码:
NSMutableArray *objArray=[NSMutableArray arrayWithObjects:
card1,
card2,
nil];
NSMutableArray *objArray2;
// NSData *data=[NSKeyedArchiver archivedDataWithRootObject:objArray];
// objArray2=[NSKeyedUnarchiver unarchiveObjectWithData:data];
objArray2=[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiverarchivedDataWithRootObject:objArray]];
// 输出objArray
NSLog(@"objArray: ");
for (AddressCard *theCard in objArray) {
[theCard print];
}
2012-12-09 22:07:11.536 DemoVideo[608:1b803] objArray:
2012-12-09 22:07:11.536 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.536 DemoVideo[608:1b803] name=Tom
2012-12-09 22:07:11.536 DemoVideo[608:1b803] email=Tom@yahoo.cn
2012-12-09 22:07:11.537 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.537 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.537 DemoVideo[608:1b803] name=LiLei
2012-12-09 22:07:11.537 DemoVideo[608:1b803] email=LiLei@yahoo.cn
2012-12-09 22:07:11.537 DemoVideo[608:1b803] =====================
// 输出objArray2
NSLog(@"objArray2: ");
for (AddressCard *theCard in objArray2) {
[theCard print];
}
2012-12-09 22:07:11.538 DemoVideo[608:1b803] objArray2:
2012-12-09 22:07:11.538 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.538 DemoVideo[608:1b803] name=Tom
2012-12-09 22:07:11.538 DemoVideo[608:1b803] email=Tom@yahoo.cn
2012-12-09 22:07:11.538 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.539 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.540 DemoVideo[608:1b803] name=LiLei
2012-12-09 22:07:11.540 DemoVideo[608:1b803] email=LiLei@yahoo.cn
2012-12-09 22:07:11.540 DemoVideo[608:1b803] =====================
// 修改了objArray中的第一个元素
AddressCard *tempCard=[objArray objectAtIndex:0];
tempCard.name=@"CarBoon";
tempCard.email=@"CarBoon@yahoo.cn";
// 输出objArray
NSLog(@"objArray: ");
for (AddressCard *theCard in objArray) {
[theCard print];
}
2012-12-09 22:07:11.541 DemoVideo[608:1b803] objArray:
2012-12-09 22:07:11.541 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.541 DemoVideo[608:1b803] name=CarBoon
2012-12-09 22:07:11.541 DemoVideo[608:1b803] email=CarBoon@yahoo.cn
2012-12-09 22:07:11.541 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.542 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.542 DemoVideo[608:1b803] name=LiLei
2012-12-09 22:07:11.543 DemoVideo[608:1b803] email=LiLei@yahoo.cn
2012-12-09 22:07:11.543 DemoVideo[608:1b803] =====================
// 输出objArray2
NSLog(@"objArray2: ");
for (AddressCard *theCard in objArray2) {
[theCard print];
}
2012-12-09 22:07:11.544 DemoVideo[608:1b803] objArray2:
2012-12-09 22:07:11.544 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.544 DemoVideo[608:1b803] name=Tom
2012-12-09 22:07:11.545 DemoVideo[608:1b803] email=Tom@yahoo.cn
2012-12-09 22:07:11.545 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.545 DemoVideo[608:1b803] =====================
2012-12-09 22:07:11.545 DemoVideo[608:1b803] name=LiLei
2012-12-09 22:07:11.546 DemoVideo[608:1b803] email=LiLei@yahoo.cn
2012-12-09 22:07:11.546 DemoVideo[608:1b803] =====================
因为在归档/反归档 过程中产生的是全新副本!并且在内存中完成!
以后,要生成一个对象的深拷贝时,如果该对象不支持NSCopying协议时,可以用这种方法来实现深拷贝!