`
hufeng
  • 浏览: 100834 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

IOS 中copy 分析

    博客分类:
  • IOS
阅读更多

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



总结如下:

 

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


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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics