NSArray实现深拷贝

来源:互联网 发布:明星语音模拟软件 编辑:程序博客网 时间:2024/05/22 02:15

我为我自定义的类,实现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协议时,可以用这种方法来实现深拷贝!


0 0