IOS 中copy 分析

copy 有 copy 和mutableCopy
string 有 NSString NSMutableString
对应NSString 浅复制代码如下:

        NSString *string = [NSString stringWithFormat:@"test"];
        NSLog(@"复制前=%ld  %p",[string retainCount],string);
        NSString *copyString = [string  copy];
        NSLog(@"复制后=%ld  %p",[string retainCount],string);
        NSLog(@"复制的对象=%ld  %p",[copyString retainCount],copyString);


测试结果如下

2015-07-30 11:02:26.875 09-test[643:303] 复制前=1  0x100108f30
2015-07-30 11:02:26.877 09-test[643:303] 复制后=2  0x100108f30
2015-07-30 11:02:26.878 09-test[643:303] 复制的对象=2  0x100108f30



对于NSString 深度复制代码如下

 NSString *string = [NSString stringWithFormat:@"test"];
        NSLog(@"深度复制前=%ld  %p",[string retainCount],string);
        NSString *copyString = [string  mutableCopy];
        NSLog(@"深度复制后=%ld  %p",[string retainCount],string);
        NSLog(@"深度复制的对象=%ld  %p",[copyString retainCount],copyString);


测试结果如下:

2015-07-30 11:06:56.875 09-test[681:303] 深度复制前=1  0x1002026d0
2015-07-30 11:06:56.877 09-test[681:303] 深度复制后=1  0x1002026d0
2015-07-30 11:06:56.878 09-test[681:303] 深度复制的对象=1  0x100204400



对于NSMutableString 的浅复制

       NSMutableString *string = [NSMutableString stringWithFormat:@"test"];
        NSLog(@"复制前=%ld  %p",[string retainCount],string);
        NSMutableString *copyString = [string  copy];
        NSLog(@"复制后=%ld  %p",[string retainCount],string);
        NSLog(@"复制的对象=%ld  %p",[copyString retainCount],copyString);


复制结果

2015-07-30 11:12:31.772 09-test[694:303] 复制前=1  0x100204340
2015-07-30 11:12:31.775 09-test[694:303] 复制后=1  0x100204340
2015-07-30 11:12:31.775 09-test[694:303] 复制的对象=1  0x1003017c0



对于NSMutableString 的深复制

    NSMutableString *string = [NSMutableString stringWithFormat:@"test"];
        NSLog(@"深度复制前=%ld  %p",[string retainCount],string);
        NSString *copyString = [string  mutableCopy];
        NSLog(@"深度复制后=%ld  %p",[string retainCount],string);
        NSLog(@"深度复制的对象=%ld  %p",[copyString retainCount],copyString);


复制结果:

2015-07-30 11:15:06.882 09-test[706:303] 深度复制前=1  0x10010b1a0
2015-07-30 11:15:06.884 09-test[706:303] 深度复制后=1  0x10010b1a0
2015-07-30 11:15:06.885 09-test[706:303] 深度复制的对象=1  0x100401b70



总结如下:

 

对象 \操作copyMutableCopy
NSString地址相同地址不同(复制后对象为NSMutableString
NSMutableString地址不同(复制后对象为NSString地址不同


1.对于不可变String 浅复制(copy) 是复制地址,既然有两个对象引用地址 计数器自然要加1,地址相同
2.对于不可变String 深度复制(mutableCopy)是复制对象的内容;既然复制内容,原来的对象(被复制的对象)只提供内容,引用计数器是不用增加的,复制的对象是新的对象,地址为新地址
3.对于可变String 浅复制和深复制 我是这么理解的,由于其可变性 无论深浅拷贝,都会返回新对象给你

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值