iOS之 深入探究copy与mutableCopy

copy的意思是复制

iOS 中提供了两种复制的方法

copymutableCopy

那么这两个家伙的区别究竟是什么,接下来介绍一下

在main.m里写入如下代码

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString * string = [NSMutableString string];

        [string appendString:@"1"];
        [string appendString:@"2"];

       NSLog(@"string->%p [string copy]->%p [string mutableCopy]->%p",string,[string copy],[string mutableCopy]);

        NSLog(@"%@ %@ %@",string,[string copy],[string mutableCopy]);




    }
    return 0;
}

运行结果

这里写图片描述

可以看到三个字符串有相同的结果,但地址不同

说明两种方法确实都复制生成了新的对象

copy出来的对象是不可变字符串

mutableCopy出来的对象是可变字符串

如果你写成

NSMutableString *str1= [string copy]; 
[str1 appendString:@“456”];

这样是错的,你运行会崩溃,不可变字符串后面不能拼接家伙

NSMutableString类型的字符串是可变字符串,它后面可以拼接字符串

它可以这样写

NSMutableString *str2 = [string mutableCopy];
[str2 appendString:@"123"];

再看一段代码

        NSString *string = @"12";
        NSString *str1 = [string copy]; // 没有产生新对象
        NSMutableString *str2 = [string mutableCopy]; // 产生新对象

         NSLog(@"string->%p str1->%p str2->%p",string,str1,str2);

运行结果

这里写图片描述

可以看出string的地址和str1的地址相同,和str2的地址不同

那么得出结论
  • copy出来的副本并不是新的对象,mutableCopy出来的副本是新对象

string本身就是个不可变字符串,所以苹果规定copy出来家伙不再生成新的内存,只是拷贝了指向同一块内存的指针

matableCopy把原对象的内容拷贝了过来,生成了一块新的内存

总结一下就是
  • copy 是指针拷贝 也就是浅拷贝
  • mutableCopy 是内容拷贝 也就是深拷贝

•来一张表

源对象类型拷贝方法副本对象类型是否产生了新对象拷贝类型
NSStringcopyNSStringNO浅拷贝(指针拷贝)
NSStringmutableCopyNSMutableStringYES深拷贝(内容拷贝)
NSMutableStringcopyNStringYES深拷贝(内容拷贝)
NSMutableStringmutableCopyNSMutableStringYES深拷贝(内容拷贝)
NSArraycopyNSArrayNO浅拷贝(指针拷贝)
NSArraymutableCopyNSMutableArrayYES深拷贝(内容拷贝)
NSMutableArraycopyNSArrayYES深拷贝(内容拷贝)
NSMutableArraymutableCopyNSMutableArrayYES深拷贝(内容拷贝)
NS*copyNS*NO浅拷贝(指针拷贝)
NS*mutableCopyNSMutable*YES深拷贝(内容拷贝)
NSMutable*copyNS*YES深拷贝(内容拷贝)
NSMutable*mutableCopyNSMutable*YES深拷贝(内容拷贝)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值