深拷贝浅拷贝的区别

用一句简单的话来说就是:  浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间;深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。系统默认的浅拷贝。想要实现深拷贝需要自己遵守NSCopying协议和NSMutableCopying协议并且重写方法。


用demo来演示一下:

自定义实体类(一)

    NSString *aName=[[NSString alloc] initWithString:@"Tom"];

    NSString *aEmail=[[NSString allocinitWithString:@"Tom@yahoo.cn"];

    int aSalary=1000;

自定义实体类(二)

    NSString *bName=[[NSString allocinitWithString:@"LiLei"];

    NSString *bEmail=[[NSString allocinitWithString:@"LiLei@yahoo.cn"];

    int bSalary=1500;

    AddressCard *card1=[[AddressCard alloc] init];

    AddressCard *card2=[[AddressCard alloc] init];

    [card1 setName:aName andEmail:aEmail andSalary:aSalary];

    [card2 setName:bName andEmail:bEmail andSalary:bSalary];

    

    NSMutableArray *objArray=[NSMutableArray arrayWithObjects:

                              card1,

                              card2,

                              nil];

    

    NSMutableArray *objArray2=[objArray mutableCopy];


// 输出objArray

    NSLog(@"objArray:      ");

    for (AddressCard *theCard in objArray) {

        [theCard print];

    } 

2012-12-07 23:06:37.708 DemoVideo[699:1b803] objArray:      

2012-12-07 23:06:37.709 DemoVideo[699:1b803] =====================

2012-12-07 23:06:37.709 DemoVideo[699:1b803] name=Tom

2012-12-07 23:06:37.709 DemoVideo[699:1b803] email=Tom@yahoo.cn

2012-12-07 23:06:37.709 DemoVideo[699:1b803] =====================

2012-12-07 23:06:37.710 DemoVideo[699:1b803] =====================

2012-12-07 23:06:37.710 DemoVideo[699:1b803] name=LiLei

2012-12-07 23:06:37.710 DemoVideo[699:1b803] email=LiLei@yahoo.cn

2012-12-07 23:06:37.711 DemoVideo[699:1b803] =====================


 // 输出objArray2

    NSLog(@"objArray2:      ");

    for (AddressCard *theCard in objArray2) {

        [theCard print];

    }

    

2012-12-07 23:07:36.547 DemoVideo[699:1b803] objArray2:      

2012-12-07 23:07:36.547 DemoVideo[699:1b803] =====================

2012-12-07 23:07:36.547 DemoVideo[699:1b803] name=Tom

2012-12-07 23:07:36.548 DemoVideo[699:1b803] email=Tom@yahoo.cn

2012-12-07 23:07:36.548 DemoVideo[699:1b803] =====================

2012-12-07 23:07:36.548 DemoVideo[699:1b803] =====================

2012-12-07 23:07:36.548 DemoVideo[699:1b803] name=LiLei

2012-12-07 23:07:36.549 DemoVideo[699:1b803] email=LiLei@yahoo.cn

2012-12-07 23:07:36.549 DemoVideo[699:1b803] =====================


//  改变card1的值

    AddressCard *tempCard=[objArray objectAtIndex:0];

    tempCard.name=@"CarBoon";

    tempCard.email=@"CarBoon@yahoo.cn";

    

    [tempCard print];

2012-12-07 23:07:50.844 DemoVideo[699:1b803] =====================

2012-12-07 23:07:50.844 DemoVideo[699:1b803] name=CarBoon

2012-12-07 23:07:50.844 DemoVideo[699:1b803] email=CarBoon@yahoo.cn

2012-12-07 23:07:50.845 DemoVideo[699:1b803] =====================


此时输出以下内容时 请注意红色高亮部分的变化

  // 输出objArray

    NSLog(@"objArray:      ");

    for (AddressCard *theCard in objArray) {

        [theCard print];

    }

    

 

2012-12-07 23:08:14.460 DemoVideo[699:1b803] objArray:      

2012-12-07 23:08:14.460 DemoVideo[699:1b803] =====================

2012-12-07 23:08:14.461 DemoVideo[699:1b803] name=CarBoon

2012-12-07 23:08:14.461 DemoVideo[699:1b803] email=CarBoon@yahoo.cn

2012-12-07 23:08:14.461 DemoVideo[699:1b803] =====================

2012-12-07 23:08:14.461 DemoVideo[699:1b803] =====================

2012-12-07 23:08:14.461 DemoVideo[699:1b803] name=LiLei

2012-12-07 23:08:14.462 DemoVideo[699:1b803] email=LiLei@yahoo.cn

2012-12-07 23:08:14.462 DemoVideo[699:1b803] =====================

    

    // 输出objArray2

    NSLog(@"objArray2:      ");

    for (AddressCard *theCard in objArray2) {

        [theCard print];

    }


 

2012-12-07 23:08:44.689 DemoVideo[699:1b803] objArray2:      

2012-12-07 23:08:45.493 DemoVideo[699:1b803] =====================

2012-12-07 23:08:45.493 DemoVideo[699:1b803] name=CarBoon

2012-12-07 23:08:45.493 DemoVideo[699:1b803] email=CarBoon@yahoo.cn

2012-12-07 23:08:45.493 DemoVideo[699:1b803] =====================

2012-12-07 23:08:46.021 DemoVideo[699:1b803] =====================

2012-12-07 23:08:46.021 DemoVideo[699:1b803] name=LiLei

2012-12-07 23:08:46.021 DemoVideo[699:1b803] email=LiLei@yahoo.cn

2012-12-07 23:08:46.021 DemoVideo[699:1b803] =====================





下面,我们来讲解,为自己创建的类实现拷贝!(深拷贝)
主要用到自己定义的类。因为默认,自己定义的类没有实现NSCopying协议和NSMutableCopying协议。
NSCopying协议:

- (id)copyWithZone:(NSZone *)zone;

NSMutableCopying协议

- (id)mutableCopyWithZone:(NSZone *)zone;


分别用来实现不可变对象的拷贝和可变对象的拷贝。
要实现自己类的拷贝,就要实现响应的协议,并且重写协议的响应方法。

代码如下:
在*.h中申明协议:

@interface AddressCard : NSObject<</span>NSCopying,NSMutableCopying>


在*.m中实现协议:

#pragma mark- NSCopying

- (id)copyWithZone:(NSZone *)zone{

    AddressCard *newCard=[[self classallocWithZone:zone];

    newCard.name=_name;

    newCard.email=_email;

    newCard.salary=salary;

    return  newCard;


}


#pragma mark- NSMutableCopying

- (id)mutableCopyWithZone:(NSZone *)zone{

    AddressCard *newCard=[[self classallocWithZone:zone];

    //[newCard setName:_name andEmail:_email andSalary:salary];

    newCard.name=_name;

    newCard.email=_email;

    newCard.salary=salary;

    return  newCard;

    

}


使用时:

AddressCard *cloneCard=[card1 copy];

    [cloneCard print];


 

2012-12-08 22:31:06.206 DemoVideo[464:1b803] =====================

2012-12-08 22:31:06.207 DemoVideo[464:1b803] name=Tom

2012-12-08 22:31:06.207 DemoVideo[464:1b803] email=Tom@yahoo.cn

2012-12-08 22:31:06.207 DemoVideo[464:1b803] =====================


    card1.name=@"changeValue";

    card1.email=@"changeValue@yahoo.cn";

    [card1 print];


 

2012-12-08 22:31:06.207 DemoVideo[464:1b803] =====================

2012-12-08 22:31:06.207 DemoVideo[464:1b803] name=changeValue

2012-12-08 22:31:06.207 DemoVideo[464:1b803] email=changeValue@yahoo.cn

2012-12-08 22:31:06.208 DemoVideo[464:1b803] =====================


    [cloneCard print];


2012-12-08 22:31:22.731 DemoVideo[464:1b803] =====================

2012-12-08 22:31:22.731 DemoVideo[464:1b803] name=Tom

2012-12-08 22:31:22.731 DemoVideo[464:1b803] email=Tom@yahoo.cn

2012-12-08 22:31:22.731 DemoVideo[464:1b803] =====================


从输出可见,card1cloneCard占有不同的内存空间!






    

  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值