IOS开发之路-Objective-C copy(浅拷贝与深拷贝)


oc中拷贝分两种,深拷贝浅拷贝

我个人认为深拷贝就像是windows中文件的复制(拷贝) , 而浅拷贝就像是windows中创建的文件快捷方式.

两者的区别在于 ,  复制是创建了一个新的文件拷贝了原来的东西 ,所以就有两个对象 . 因为两个对象所在路径是不一样的.

而快捷方式呢 ,则是引用了原来文件的路径 , 但并不会创建新文件.


深拷贝 和 浅拷贝 原理也一样  .

深拷贝内容拷贝 ,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1

浅拷贝:   指针拷贝 源对象的和副本指向的是同一对象 对象的引用计数+1,其实相当于做了一次retain操作。

只有不可变对象创建不可变副本(copy)才是浅拷贝,其他都是深拷贝。

 

比如:

    NSString *string = @"hello Objective-c";

    NSString *str = [string copy];

    NSLog(@"%i",str == string);

    NSLog(@"副本计数器:%zi",[str retainCount]);

上例中string 是不可变字符串 ,  copy后也会变一个不可变的字符串 。 所以str 指向的是string 的地址 。  所以 i 的值为1 (两对象地址相同).

所以上例是浅拷贝


    NSString *string = [NSString stringWithFormat:@"hello objective-c"];

    NSString *str = [string mutableCopy];

    NSLog(@"%i",string == str);

    NSLog(@"副本计数器:%zi",[str retainCount]);


上例中虽然string是不可变字符串 , 但是mutableCopy之后会返回一个可变字符串 。 接收的确实不可变字符串所以 i  为0 (str 和string 地址不相同) 

所以是深拷贝


简单的说 判断是深拷贝还是浅拷贝的方式 就是看它有没有生成新的对象 .

如果生成了新的对象那么就是深拷贝 , 反之亦然 .


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值