copy和mutable copy

一,浅拷贝
只是指针的拷贝,并没有内存的改变。
二,深拷贝
会新生成一块内存,这块内存的初始值和原内存的初始值是相同的。但新内存存的值不可以改变
三,可变拷贝
也会新生成一个块新的内存,新内存的值和原内存的初始值是相同的,新内存存的值可改变。
代码如下:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...

        /*浅拷贝
         两个指针指向的是同一块内存,所以打印的地址相同
         */
        NSString * strA = @"abc";
        NSString * strB = [strA copy];
        NSLog(@"strA:%p,strB:%p",strA,strB);

        /*深拷贝
         两个指针指向的是不同的内存,只不过初始值相同。新的内存值不可改变
         */
        NSMutableString * str1 = [NSMutableString stringWithString:@"Hello"];
        NSString * str2 = [str1 copy];

        /*可变拷贝
         两个指针指向的是不同的内存,初始值相同。新的内存值可改变
         */
        NSMutableString * str3 = [str1 mutableCopy];
        NSLog(@"str1:%@,%p;str2:%@,%p;str3:%@,%p",str1,str1,str2,str2,str3,str3);

        [str1 appendString:@"World"];
        [str3 appendString:@"China"];
        NSLog(@"str1:%@,%p;str2:%@,%p;str3:%@,%p",str1,str1,str2,str2,str3,str3);


    }
    return 0;
}

以下是控制台输出:
这里写图片描述

*注意点:
1,深拷贝和浅拷贝的区分是以是否开辟新的内存来进行区分的,也就是使用copy关键字,既可能是浅拷贝,也可能是深拷贝。关键是看指针初始指向的内存区块是否为可变内存区块。
2,一个对象是否能够进行拷贝,关键是看这个对象是否实现了NSCopy协议,也就是要实现- (id)copyWithZone:(nullable NSZone *)zone;

扩展:
copy方法除了可以对对象进行深拷贝以外还有个优点就是,相比于重新创建一个对象,copy的效率更高。例如要创建一百个MyTeam对象,实例化一个对象然后使用copy方法的效率要比实例化一百次高得多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值